Microsoft Word - beej-zhtw.docx

Size: px
Start display at page:

Download "Microsoft Word - beej-zhtw.docx"

Transcription

1 Beej's Guide to Network Programming 正體中文版 Brian Beej Jorgensen Hall 著 Aaron Liao 譯

2 目錄 簡介... 5 進階資料... 5 原著資訊... 6 簡體中文版 導讀 本書的讀者 平台與編譯器 官方網頁與書本 Solaris/SunOS 程式設計師該注意的事 Windows 程式設計師該注意的事 來信原則 鏡射站台 (Mirroring) 譯者該注意的 版權與散佈 何謂 Socket 兩種 Internet Sockets 底層漫談與網路理論 IP address 結構與資料轉換 IPv4 與 IPv Sub network ( 子網段 ) Port Number( 連接埠號碼 ) Byte Order( 位元組順序 ) 資料結構 IP 位址, 續集 Private Network 從 IPv4 移植為 IPv System call 或 Bust getaddrinfo()- 準備開始! socket()- 取得 File Descriptor! bind()- 我在哪個 port? connect(), 嘿! 你好 listen()- 有人會呼叫我嗎? accept()- 謝謝你 call 3490 port send() 與 recv()- 寶貝, 我們來聊天! sendto() 與 recvfrom()- 來點 DGRAM close() 與 shutdown()- 你消失吧!

3 5.10. getpeername()- 你是誰? gethostname()- 我是誰? Client Server 基礎 簡易的 Stream Server 簡易的 Stream Client Datagram Sockets 進階技術 Blocking( 阻塞 ) select(): 同步 I/O 多工 不完整傳送的後續處理 Serialization: 如何封裝資料 資料封裝 廣播封包 :Hello World! 常見的問題 Man 使用手冊 accept() bind() connect() close() getaddrinfo(), freeaddrinfo(), gai_strerror() gethostname() gethostbyname(), gethostbyaddr() getnameinfo() getpeername() errno fcntl() htons(), htonl(), ntohs(), ntohl() inet_ntoa(), inet_aton(), inet_addr inet_ntop(), inet_pton() listen() perror(), strerror() poll() recv(), recvfrom() select() setsockopt(), getsockopt() send(), sendto() shutdown() socket()

4 9.24. struct sockaddr and pals 參考資料 書籍 網站參考資料 RFC 原著誌謝 譯者誌謝 聯絡

5 簡介 本書是 Linux socket 網路程式設計的敲門磚, 對初學者而言是一份很好的開始, 尤其第七章介紹了重要的 Linux socket 網路程式設計技巧與觀念 網址 : GitBook 版本 : 本中文版著作係採用創用 CC 姓名標示 - 非商業性 - 禁止改作 3.0 台灣授權條款. [ 進階資料 下列是譯者認為值得推薦的 Linux/UNIX socket 網路程式設計書籍 : Unix Network Programming Vol. 1 o W. Richard Stevens 大師的網路經典著作之一, 對 socket 網路程式設計有更深入的介紹 ( 如 raw socket data link layer socket 或新型的 SCTP 傳輸層協定 ) Effective TCP/IP Programming: 44 Tips to Improve Your Network Programs( 中文版 ) o Jon C. Snader 說明如何設計高效能 高可靠度的 socket 網路程式 The Linux Programming Interface( 中文版尚未出版 ) o 包羅萬象的 Linux/Unix 系統程式 API 開發手冊大全, 要設計 multiple threads 網路程式可參考這本書, 細節請參考作者網站 基礎からわかる TCP/IP ネットワーク実験プログラミング第 2 版 ( 中文版 ) o 村山公保介紹 port scan scan route TCP hijack TCP RST 攻擊 TCP SYN 攻擊 ARP spoofing 網路分析 network sniffer(raw socket 與 data link layer socket) 等網路攻擊 網路分析的原理及技術, 並有原始程式碼教導如何用 Linux 與 C 語言設計這類網路程式 更多資訊請參考作者在 10.1 節推薦的書籍 上述技術屬使用者空間 (user space) 的網路應用程式, 對於作業系統如何在核心空間 (kernel space) 實作網路堆疊及資料結構設計, 可參考下列書籍 : 5

6 W. Richard Stevens, TCP/IP Illustrated - The Implementation, Volume 2, Addison-Wesley Professional, Rami Rosen, Linux Kernel Networking: Implementation and Theory, first edition, Apress, Christian Benvenuti, Understanding Linux network internals, O'Reilly, 2006.( 中文版 ) Klaus Wehrle et al., Linux Networking Architecture, Prentice Hall, Thomas Herbert, The Linux TCP/IP Stack: Networking for Embedded Systems, 2nd edition, Charles River Media, 原著資訊 書名 :Beej s Guide to Network Programming - Using Internet Sockets 作者 :Brian Beej Jorgensen Hall 版次 :Version , July 3, 網站 : 授權 : 參考 1.9 節下載 :PDF ( 簡體中文版 簡體中文讀者的一些電腦術語與正體中文不太一樣, 所以譯者已經初步調整出一個初版, 日後閒暇之餘再慢慢修正一些細節錯誤, 若願意幫忙維護簡體中文版的讀者, 也請來信告知 (aaron@netdpi.net) 简体中文版 : 6

7 1. 導讀 嘿!Socket 程式設計讓你覺得很挫折嗎? " 這份教材是否只摘錄了 man 使用手冊而已呢?" " 網路程式很難嗎?" 你想要設計很酷的網路程式, 可是沒有那麼多空閒時間可以瞭解一大堆資料結構, 而且還需要知道 " 呼叫 connect() 之前一定要先呼叫 bind()" 的順序等 好, 猜到了嗎! 其實我已經完成了這件痛苦的事情, 我正要與你們分享這些資訊, 所以你來對地方了 本文的目的是提供一份網路程式設計簡介, 給想要了解網路程式的 C 程式設計師 在這邊做個小結, 我在本文件加上最新的資訊 [ 其實也還好 ], 並增加 IPv6 的介紹! 大家好好閱讀它吧! 1.1. 本書的讀者 本文件是一份導覽 (tutorial), 不是全方位的參考書 這份文件其實沒什麼了不起, 不僅不夠全面, 也沒有完整到足以做為 socket 程式設計的大全 不過期盼本文能讓大家不要害怕 man 手冊 :-) 1.2. 平台與編譯器 本文談到的程式碼是在 Linux PC 上, 使用 GNU 的 gcc 編譯器所編譯的 然而, 它應該在任何有 gcc 的平台上都能編譯 不過實際上, 如果你在 Windows 上寫程式, 這可能會有點不太一樣, 請參考下列關於 Windows 程式設計的章節 7

8 1.3. 官方網頁與書本 本文件的官方位置是 在這裡你也能找到程式碼的範 例, 以及各種語言的譯本 如果需要購買價格比較好的複本 [ 有人稱為 " 書 "], 請到 我很感謝您的購買, 因為這可以幫忙我繼續依 靠寫文件吃飯! 我曾經加入一個很有名的網路書商, 不過他們新的客戶追蹤系統與已出版的文件無法相容 因此, 我不能收到任何回饋金了 所以, 如果你同情我的處境, 請使用 paypal 贊助我 [beej@beej.us]:-) 1.4. Solaris/SunOS 程式設計師該注意的事 當編譯 Solaris 或 SunOS 平台的程式時, 你需要指定一些額外的命令列參數, 以連結 (link) 正確的函式庫 (library) 為了達到這個目的, 可以在編譯指令後面簡單加上 " lnsl lsocket lresolv", 類似這樣 : $ cc -o server server.c -lnsl -lsocket -lresolv 如果還是有錯誤訊息, 你可以再加上一個 " lnext" 到命令列的尾端 我不太清楚這樣做了什麼事, 不過有些人是會這樣用 你可能會遇到的另一個問題是呼叫 setsockopt() 這個原型與在我 Linux 系統上的不一樣, 所以可以這樣取代 : int yes=1; 輸入這行 : char yes='1'; 因為我沒有 Sun 系統, 所以我無法測試上面的資訊, 這只是有人用 跟我說的 8

9 1.5. Windows 程式設計師該注意的事 本文以前只討論一點 Windows, 純粹是我很不喜歡 不過我應該要客觀的說 Windows 其實提供很多基本安裝, 所以顯然是個完備的作業系統 人家說 : 小別勝新婚, 這裡我相信這句話是對的 [ 或許是年紀的關係 ] 不過我只能說, 我已經十幾年沒有用 Microsoft 的作業系統來做自己的工作了, 這樣我很開心! 其實我可以打出安全牌, 只告訴你 :" 沒問題阿, 你儘量去用 Windows 吧! " 沒錯, 其實我是咬著牙根說這些話的 所以我還是在拉攏你來試試 Linux [1] BSD [2], 或一些 Unix 風格的系統 不過人們各有所好, 而 Windows 的使用者也樂於知道這份文件的內容能用在 Windows, 只是需要改變一點程式碼而已 你可以安裝一個酷玩意兒 - Cygwin [3], 這是讓 Windows 平台使用的 Unix 工具集 我曾在秘密情報網聽過, 這個能讓全部的程式不經過修改就能編譯 不過有些人可能想要用純 Windows 的方法來做 只能說你很有勇氣, 而你所要做的事就是 : 立刻去弄個 Unix! 喔, 不是, 我開玩笑的 這些日子以來, 大家一直認為我對 Windows 是很友善的 你所要做的事情就是 [ 除非你安裝了 Cygwin!]: 首先要忽略我這邊提過的很多系統 header( 標頭檔 ), 而你唯一需要 include ( 引用 ) 的是 : #include <winsock.h> 等等, 在你用 socket 函式庫做任何事情之前, 必須要先呼叫 WSAStartup() 程式碼看起來像這樣 : #include <winsock.h> { WSADATA wsadata; // if this doesn't work //WSAData wsadata; // then try this instead 9

10 // MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) for Winsock 2.0: if (WSAStartup(MAKEWORD(1,1), &wsadata)!= 0) { fprintf(stderr, "WSAStartup failed.\n"); exit(1); 你也必須告訴編譯器要連結 Winsock 函式庫, 在 Winsock 2.0 通常稱為 wsock32.lib 或 winsock32.lib 或 ws2_32.lib 在 VC++ 底下, 可以透過專案 (Project) 選單, 在設定 (Settings) 底下 按下 Link 標籤, 並找到 "Object/library modules" 的標題 新增 "wsock32.lib"( 或者你想要用的函式庫 ) 到清單中 最後, 當你處理好 socket 函式庫時, 你需要呼叫 WSACleanup(), 細節請參考線上手冊 只要你做好這些工作, 本文後面的範例應該都能順利編譯, 只有少部分例外 還有一件事情, 你不能用 close() 關閉 socket, 你要用 closesocket() 來取代 而且 select() 只能用在 socket descriptors 上, 不能用在 file descriptors( 像 stdin 的值就是 0) 還有一種你能用的 socket 類型,CSocket, 細節請查詢你的編譯器使用手冊 要取得更多關於 Winsock 的訊息可以先閱讀 Winsock FAQ [4] [1] [2] [3] [4] 最後, 我聽說 Windows 沒有 fork() system call, 我在一些範例中會用到 你可能需要連結到 POSIX 函式庫或要讓程式能動的一些函式庫, 或許你也可以用 CreateProcess() 來取代 fork() 不需要參數, 但是 CreateProcess() 卻需要大約 480 億個參數 如果你不想用,CreateThread() 會稍微比較容易理解 不過多執行緒 (multithreading) 的討論則不在本文件的範疇中 我只能盡量提及, 10

11 你要體諒! 1.6. 來信原則 通常我很樂意幫助解決來信的問題, 所以請儘管寫信來, 不過, 我不一定會回信, 我很忙, 而且還有三次沒有回答你們的問題 在這種情況下, 我通常只會把訊息刪掉, 這並沒有針對任何人 ; 我只是沒空可以詳細答覆問題 同樣的原則, 越複雜的問題我就越不想回答 如果你很想要收到答覆, 你可以在寄信之前先簡化你的問題, 並確定你引述了相關的資訊 [ 比如平台 編譯器 得到的錯誤訊息, 以及任何你想的到可以協助我找出問題的資訊 ] 對於更多的要點, 請閱讀 ESR 的文件, 提問的智慧 (How To Ask Questions The Smart Way) [5] [5] questions.html 若你沒有收到答覆, 請自行先好好 hack( 徹底研究 ) 一番, 試著找出答案, 如果真的還是無法解決, 那麼再寫信給我, 並提供你找到的資訊, 期盼會有足夠資訊可以讓我幫忙解決 現在我一直拉著你說要怎樣才能寫信給我, 以及哪些情況千萬別寫信給我, 我只想讓你知道, 我衷心地感謝這幾年所收到的讚美 這文件真的是個輕薄短小的資料, 而且我很高興聽到大家說它非常實用!: ) 感謝您! 1.7. 鏡射站台 (Mirroring) 歡迎鏡射本站, 無論公開或私人的 若你公開鏡射本站, 並想要我從官網連結, 請送個訊息到 beej@beej.us 1.8. 譯者該注意的 如果你想要將本文件翻譯為其它語言, 請寄信到 beej@beej.us, 我會從官方主頁連結你的譯本, 請隨意加上你的名字與聯絡資訊到譯本中 請注意下列 [ 版權與散佈 ] 一節所列的授權限制, 如果你想要我放譯本, 跟我說就好了 ; 若你想要自己架站, 我會連結到你所提供的網址, 任何方式都行 11

12 1.9. 版權與散佈 Beej's Guide to Network Programming 版權是屬於 Copyright 2012 Brian Beej Jorgensen Hall 對於特定的程式碼與譯本, 在下面會另外說明, 本作品基於 Creative Commons Attribution Noncommercial No Derivative Works 3.0 License 授權 欲檢視該授權的複本請參考 nc nd/3.0/,creative Commons, 或者寫封信到這個住址 :171 Second Street, Suite 300, San Francisco, California, 94105, USA. 對於該授權 No Derivative Works 這部分的例外如下 : 這份文件可以自由翻譯成任何語言, 提供的譯本要正確, 而重新列印時需要保持本作品的完整性 原本的作品授權規範亦會套用於譯本上 譯本可以包含譯者的名字與聯絡資訊 本作品所介紹的 C 原始程式碼以公眾領域 (public domain) 授權, 並完全免於任何授權限制 歡迎老師們免費推薦或提供本作品的複本給你們的學生使用 需要更多訊息請聯繫 beej@beej.us 譯註 : 中文讀者可來信給 (Aaron Liao: aaron@netdpi.net) 以下是 1.9 節, 版權說明的原文內容 : Beej's Guide to Network Programming is Copyright 2012 Brian Beej Jorgensen Hall. With specific exceptions for source code and translations, below, this work is licensed under the Creative Commons Attribution Noncommercial No Derivative Works 3.0 License. To view a copy of this license, visit nc nd/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. One specific exception to the No Derivative Works portion of the license is as follows: this guide may be freely translated into any language, provided the translation is accurate, and the guide is reprinted in its entirety. The same license restrictions apply to the translation as to the original guide. The translation may also include the name and contact information for the translator. The C source code presented in this document is hereby granted to the public domain, and is completely free of any license restriction. Educators are freely encouraged to recommend or supply copies of this guide to their students. 12

13 Contact for more information. 13

14 2. 何謂 Socket 你一直聽到人家在講 "sockets", 你可能也想知道這些是什麼東西 好的, 其實它們就是 :" 利用標準 UNIX file descriptors( 檔案描述子 ) 與其它程式溝通的一種方式 " " 什麼?" OK, 你可能有聽過有些駭客 (hacker) 說過 :" 我的天呀! 在 UNIX 系統中的任何東西都可以視為檔案!" 他說的是真的, 不是假的 當 UNIX 程式要做任何類型的 I/O 時, 它們會讀寫 file descriptor File descriptor 單純是與已開啟檔案有關的整數 只是 [ 關鍵在於 ], 該檔案可以是一個網路連線 FIFO pipe( 管線 ) terminal( 終端機 ) 真實的磁碟檔案 或只是相關的東西 在 UNIX 所見都是檔案! 所以當你想要透過 Internet( 網際網路 ) 跟其它的程式溝通時, 你需要透過一個 file descriptor 來達成, 這點你一定要相信 " 那麼,Smarty Pants 先生, 我在哪裡可以取得這個用在網路通信的 file descriptor 呢?" 這可能是你現在心裡的問題, 我會跟你說的 : 你能呼叫 socket() system routine ( 系統常式 ) 它會傳回 socket descriptor, 你可以用精心設計的 send() 與 recv() socket calls[man send man recv] 來透過 socket descriptor 進行通信 " 不過, 嘿嘿!" 現在你可能在想 :" 既然只是個 file descriptor, 為什麼我不能用一般的 read() 與 write() call 透過 socket 進行通信, 而要用這什麼鬼東西阿?" 簡而言之 :" 可以!" 完整說來就是 :" 可以, 不過 send() 與 recv() 讓你能對資料傳輸有更多的控制權 " 14

15 " 接下來呢?" 這麼說吧 : 有很多種 sockets, 如 DARPA Internet Sockets( 網際網路位址 ) 本機端上的路徑名稱 (path names on a local node,unix Sockets) CCITT X.25 位址 ( 你可以放心忽略 X.25 Sockets), 可能還有其它的, 要看你用的是哪種 UNIX 系統 在這裡我們只討論第一種 :Internet Sockets 2.1. 兩種 Internet Sockets 這是什麼? 有兩種 Internet socket 嗎? 是的, 喔不, 我騙你的啦 其實有很多種的 Internet socket, 只是我不想嚇到你, 所以這裡我只打算討論兩種 不過我還會告訴你 "Raw Socket", 這是很強大的東西, 所以你應該要好好研究一下它們 譯註 : 一般的 socket 只能讀取傳輸層以上 [ 不含 ] 的資訊,raw socket 一般用在設計 network sniffer, 可以讓應用程式取得網路封包底層的資訊 [ 如 TCP 層 IP 層, 甚至 link layer socket 可以讀取到 link layer 層 ], 並用以分析封包資訊 這份文件不會談到這類的程式設計, 有興趣的讀者可自行參考 :Unix Network Programming Vol. 1 libpcap 或 TCP/IP 網路程式實驗與設計 [ 內容包含介紹網路攻擊 port scan scan route TCP hijack TCP RST 攻擊 TCP SYN 攻擊 ARP spoofing 網路分析 network sniffer(raw socket 與 data link layer socket) 等原理及技術, 並有原始程式碼教導如何用 Linux 與 C 語言設計這類網路攻擊及網路分析程式 ] 好吧, 不聊了 到底有哪兩種 Internet socket 呢? 其中一個是 "Stream Socket"( 串流式 Socket), 而另一個是 "Datagram Socket" ( 訊息式 Socket), 之後我們分別以 "SOCK_STREAM" 與 "SOCK_DGRAM" 來表示 Datagram sockets 有時稱為 " 免連線的 sockets"(connectionless socket)( 雖然它們也可以用 connect(), 如果你想這麼做的話, 請見後面章節的 connect()) Stream socket 是可靠的 雙向連接的通信串流 若你以 "1 2" 的順序將兩個項目輸出到 socket, 它們在另一端則會以 "1 2" 的順序抵達 而且不會出錯 哪裡會用到 stream socket 呢? 15

16 好的, 你應該聽過 telnet 程式吧, 不是嗎? 它就是用 stream socket 你所輸入的每個字都需要按照你所輸入的順序抵達, 不是嗎? 網站瀏覽器所使用的 HTTP 通訊協定也是用 stream socket 取得網頁 的確, 若你以 port 80 telnet 到一個網站, 並輸入 "GET / HTTP/1.0", 然後按兩下 Enter, 它就會輸出 HTML 給你! Stream socket 是如何達成如此高品質的資料傳送呢? 它們用所謂的 "The Transmission Control Protocol"( 傳輸控制協定 ), 就是常見的 "TCP"(TCP 的全部細節請參考 RFC 793[6]) TCP 確保你的資料可以依序抵達而且不會出錯 你以前可能聽過 "TCP" 是 "TCP/IP" 裡比較好的部分, 這邊的 "IP" 是指 "Internet Protocol"( 網際網路協定, 請見 RFC 791[7]) IP 主要處理 Internet routing( 網際網路的路由遶送 ), 通常不保障資料的完整性 酷喔 那 Datagram socket 呢? 為什麼它們號稱免連線呢? 這邊有什麼好主意? 為什麼它們是不可靠的? 好, 這裡說明一下現況 : 如果你送出一個 datagram( 訊息封包 ), 它可能會順利到達 可能不會按照順序到達, 而如果它到達了, 封包中的資料就是正確的 譯註 : TCP 會在傳輸層對將上層送來的過大訊息分割成多個分段 (TCP segments), 而 UDP 本身不會,UDP 是訊息導向的 (message oriented), 若 UDP 訊息過大時 ( 整體封包長度超過 MTU), 則會由 host 或 router 在 IP 層對封包進行分割, 將一個 IP packet 分割成多個 IP fragments IP fragmention 的缺點是, 接收端的系統需要做 IP 封包的重組, 將多個 fragments 重組合併為原本的 IP 封包, 同時也會增加封包遺失的機率 如將一個 IP packet 分裂成多個 IP fragments, 只要其中一個 IP fragment 遺失了, 接收端就會無法順利重組 IP 封包, 因而造成封包的遺失, 若是高可靠度的應用, 則上層協定需重送整個 packet 的資料 [6] [7] Datagram sockets 也使用 IP 進行 routing( 路由遶送 ), 不過它們不用 TCP; 16

17 而是用 "UDP,User Datagram Protocol"( 使用者資料包協定, 請見 RFC 768 [8]) 為什麼它們是免連線的? 好, 基本上, 這跟你在使用 stream socket 時不同, 你不用維護一個開啟的連線, 你只需打造封包 給它一個 IP header 與目的資訊 送出, 不需要連線 通常用 datagram socket 的時機是在沒有可用的 TCP stack 時 ; 或者當一些封包遺失不會造成什麼重大事故時 這類應用程式的例子有 :tftp(trivial file transfer protocol, 簡易檔案傳輸協定, 是 FTP 的小兄弟 ), 多人遊戲 串流音樂 影像會議等 " 等一下!tftp 和 dhcpd 是用來在一台主機與另一台之間傳輸二進制的應用資料! 你如果想要應用程式能在資料抵達時正常運作, 那資料就不能遺失阿! 這是什麼黑魔法?" 好, 我的人族好友,tftp 與類似的程式會在 UDP 的上層使用它們自己的協定 比如 :tftp 協定會報告每個收送的封包, 接收端必須送回一個封包表示 :" 我收到了!"[ 一個 "ACK" 回報封包 ] 若原本封包的傳送端在五秒內沒有收到回應, 這表示它該重送這個封包, 直到收到 ACK 為止 在實作可靠的 SOCK_DGRAM 應用程式時, 這個回報的過程很重要 對於無需可靠度的 (unreliable) 應用程式, 如遊戲 音效 或影像, 你只需忽略遺失的封包, 或也許能試著用技巧彌補回來 ( 雷神之鎚的玩家都知道的一個技術名詞的影響 :accursed lag 在這個例子中,"accursed"( 受詛咒 ) 這個字代表各種低級的意思 ) 為什麼你要用一個不可靠的底層協定? 有兩個理由 : 第一個理由是速度, 第二個理由還是速度 直接忘了遺失的這個封包是比較快的方式, 相較之下, 持續追蹤全部的封包是否安全抵達, 並確保依序抵達是比較慢的 如果你想要傳送聊天訊息,TCP 很讚 ; 不過如果你想要替全世界的玩家, 每秒送出 40 個位置更新的資訊, 且若遺失一到兩個封包並不會有太大的影響時, 此時 UDP 是一個好的選擇 [8] 譯註 : stream( 串流式 )socket 是指應用程式要傳輸的資料就如水流 ( 串流 ) 在水管 17

18 中傳輸一般, 經由這個 stream sockett 流向目的, 串流式 socket 是資料會會由傳輸層負責處理遺失 依序送送達等工作, 以在傳傳輸層確保保應用程式式所送出的的資料能夠可靠且依序抵達, 而應用程式若若對資料有有可靠與依依序的需求求時, 使用 stream socket 就不不用自行處處理這類的的工作 datagram( 訊息式 )socket 是基於訊息息導向的方方式傳送資資料, 應用用程式送出出的每筆資料會如平信的概念送出, 由於遶遶送封包的的路徑可能能會隨著網網路條件而而改變, 每筆資料抵達的順序不一一定會按照照送出的順順序抵達, 並且如平平信般, 信件可能在遞送過程遺失, 而寄件人並無法法知道是否否遞送成功功 初步簡單知道應用這兩種 sockets 的時機 : 當需需要資料能能完整送達達目地時, 就使用 stream socket, 若是部部分資料遺遺失也無妨妨時, 就可以使用 datagram socket 2.2. 底層漫漫談與與網路路理論 因為我只著著重於協定定的分層, 該是談談談網路是如如何真正的的運作的時時候了, 並呈現一些如何何打造 SOCK_DGRAM 封包的的例子 就就實務面, 你或許可可以跳過這這一節, 不過, 這一節有有很好的觀觀念背景, 所以需要要的人可以以讀一讀 嘿! 孩子們, 該是學學習資料封封裝 (Data Encapsulation) 的時候了 這很重要, 它就是如此重要, 即使你是在在加州這裡裡上的網路路課程, 也只能學到到皮毛 基本上我們們會講到這這些內容 : 封包的誕生 將封包打包 [ 封裝 ] 到第一一個協定 [ 所謂的 TFTP 協定定 ] 的 header 中 [ 幾乎是是最底層了 ], 接著著將全部的的東西 [ 包含 TFTP header] 封封裝到下一一個協定中 [ 所謂的 UDP], 接著著下一個協協定 [IP], 最後銜接接到硬體 [ 實體 ] 層上面的通訊協協定 [ 所謂謂的 Ethernet, 乙太太網路 ] 當另一台電腦收到封封包時, 硬體會解開 Ethernet header, 而 kernel 會解開 IP 與 UDP header, 再來由 TFTP 程式解開 TFTP header, 最後程式可可以取得資料 18

19 現在我最後要談個聲名狼藉的分層網路模型 (Layered Network Model), 亦稱 "ISO/OSI" 這個網路模型介紹了一個網路功能系統, 有許多其它模型的優點 例如, 你可以寫剛好一樣的 socket 程式, 而不用管資料在實體上是怎麼傳送的 [Serial thin Ethernet AUI 之類 ] 因為在底層的程式會幫你處理這件事 真正的網路硬體與拓樸對 socket 程式設計師而言是透明的 不囉嗦, 我將介紹這個成熟模型的分層 為了網路課程的測驗, 要記住這些 Application( 應用層 ) Presentation( 表現層 ) Session( 會談層 ) Transport( 傳輸層 ) Network( 網路層 ) Data Link( 資料鏈結層 ) Physical( 實體層 ) 實體層就是硬體 (serial Ethernet 等 ) 而應用層你可以盡可能的想像, 這是個使用者與網路互動的地方 現在這個模型已經很普及, 所以你如果願意的話, 或許可以將它當作一本汽車修理指南來用 與 Unix 比較相容的分層模型有 : 應用層 (Application layer:telnet ftp 等 ) 主機到主機的傳輸層 (Transport layer:tcp UDP) 網際網路層 (Internet layer:ip 與路由遶送 ) 網路存取層 (Network Access Layer:Ethernet wi fi 諸如此類) 此時, 你或許能知道這幾層是如何對應到原始資料的封裝 看看在打造一個簡單的封包需要多少工作呢? 天阿! 你得自己用 "cat" 將資訊填入封包的 header 裡! 開玩笑的啦 19

20 你對 stream socket 需要做的只有用 send() 將資料送出 而在 datagram socket 需要你做的是, 用你所選擇的方式封裝該封包, 並且用 sendto() 送出 Kernel 會自動幫你建立傳輸層與網路層, 而硬體處理網路存取層 啊! 真現代化的技術 所以該結束我們短暫的網路理論之旅了 喔! 對了, 我忘記告訴你我想要談談 routing( 路由遶送 ) 了 恩, 沒事! 沒關係, 我不打算全部講完 Router( 路由器 ) 會解開封包的 IP header, 參考自己的 routing table( 路由表 ) 如果你真的很想知道, 你可以讀 IP RFC [9] 如果你永遠都不想碰它, 其實你也可以過得很好 [9] 20

21 3. IP address 結構與資料轉換 這裡是好玩的地方, 我們要開始談程式碼了 不過, 我們一開始要討論的程式碼會比較少! 耶! 因為我想要先講點 IP address( 位址 ) 與 port( 連接埠 ), 這樣才會有點感覺 ; 接著我們會討論 socket API 如何儲存與控制 IP address 和其它資料 3.1. IPv4 與 IPv6 在 Ben Kenobi 還是叫 Obi Wan Kenobi 的那段過去的美好時光, 有個很棒的 network routing system( 網路路由系統 ), 稱為 Internet Protocol Version 4( 網際網路協定第四版 ), 又稱為 IPv4 它的位址是由四個 bytes 組成 ( 亦稱為四個 "octets"), 而格式是由句點與數字組成, 像是這樣 : 你或許曾經看過 實際上, 在撰寫本文時, 幾乎整個 Internet( 網際網路 ) 的每個網站都還是使用 IPv4 每個人跟 Obi Wan 都很開心, 一切都是如此美好, 直到某個名為 Vint Cerf 的人提出質疑, 警告所有人 IPv4 address 即將耗盡 Vint Cerf [10] 除了提出即將到來的 IPv4 危機警告, 他本身還是有名的 Internet 之父, 所以我真的沒資格能評論他的判斷 你說的是耗盡 address 嗎? 會發生什麼事呢? 其實我的意思是,32 bit 的 IPv4 address 有幾十億個 IP address, 我們真的有幾十億台的電腦在用嗎? 是的 在一開始大家也是認為這樣就夠用了, 因為當時只有一些電腦, 而且每個人認為幾十億是不可能用完的大數目, 還很慷慨的分給某些大型組織幾百萬個 IP address 供他們自己使用 [ 例如 :Xerox MIT Ford HP IBM GE AT&T 及某個名為 Apple 的小公司, 族繁不及備載 ] 21

22 不過現實狀況是, 如果不是有些變通的方法, 我們早就用光 IPv4 位址了 我們現在生活於每個人 每台電腦 每部計算機 每隻電話 每部停車計時收費器 以及每條小狗 [ 為什麼不行?] 都有一個 IP address 的年代, 因此,IPv6 誕生了 因為 Vint Cerf 可能是不朽的,[ 即使他的軀殼終究該回歸自然, 我也希望永遠不會發生, 不過他的精神或許已經以某種超智慧的 ELIZA [11] 程式存在於 Internet2 的核心 ], 應該沒有人想要因為下一代的網際網路協定沒有足夠的位址, 然後又聽到他說 :" 我要告訴你們一件事..." 那你有什麼建議嗎? 我們需要更多的位址, 我們需要不止兩倍以上的位址 不止幾十億倍 千兆倍以上, 而是 79 乘以百萬乘以十億乘以兆倍以上的可用位址! 你們大家將會見識到的 你說 :"Beej, 真的嗎? 我還是有許多可以質疑這個大數字的理由 " 好的,32 bits 與 128 bits 的差異聽起來似乎不是很多 ; 它只多了 96 個 bits 而已, 不是嗎? 不過請記得, 我們所談的是等比級數 ;32 bits 表示個 40 億的數字 [2 的 32 次方 ], 而 128 bits 表示的大約是 340 個兆兆兆的數字 [2 的 128 次方 ], 這相當於宇宙中的每顆星星都能擁有一百萬個 IPv4 Internets 大家順便忘了 IPv4 的句號與數字的長相吧 ; 現在我們有十六進制的表示法, 每兩個 bytes 間以冒號分隔, 類似這樣 : 2001:0db8:c9d2:aee5:73e3:934a:a5ae:9551 這還不是全部呢! 大部分的時候, 你的 IP address 裡面會有很多個零, 而你可以將它們壓縮到兩個冒號間, 你也可以在每個 byte pair( 位元組對 ) 上保留零 例如, 這些位址的配對是相等的 : 2001:0db8:c9d2:0012:0000:0000:0000: :db8:c9d2:12:: :0db8:ab00:0000:0000:0000:0000: :db8:ab00:: 22

23 0000:0000:0000:0000:0000:0000:0000:0001 ::1 [10] [11] 位址 ::1 是個 loopback( 遶回 ) 位址, 它永遠只代表 " 我現在執行的這台電腦 ", 在 IPv4 中,loopback 位址是 最後, 你可能會遇到 IPv6 與 IPv4 相容的模式 例如, 如果你願意的話, 你可以將 IPv4 address 以 IPv6 位址表示, 可以使用如下的符號 : "::ffff: " 因為所謂的自信, 所以 IPv6 的發明人很有把握的保留了兆來兆去的位址, 不過說實在的, 我們有這麼多位址, 誰能算清楚呢? 還剩下很多位址可以分配給星系中每個行星的每個男人 女人 小孩 小狗跟停車計時收費器 相信我, 星系中的每個行星都有行車計時收費器 你明白這是真的 Sub network ( 子網段 ) 為了結構化的理由, 有時我們這樣宣告是很方便的 :"IP address 的前段是 IP address 的 network( 網段 ), 而後面的部分是 host( 主機 ) " 例如 : 在 IPv4, 你可能有 , 而我們可以說前面三個 bytes 是 network, 而最後一個 byte 是 host 或者換個方式, 我們能說 host 12 位在 network [ 請參考我們如何將 host byte 清為零 ] 接下來要講的是過時的資訊了! 真的嗎? 很久很久以前, 有 subnets( 子網路 ) 的 "class"( 分級 ), 在這裡, 位址的第一個 前二個或前三個 bytes 都是屬於 network 的一部分 如果你很幸運可以擁有一個 byte 的 network, 而另外三個 bytes 是 host 位址, 那在你的網 23

24 路上, 你有價值 24 bits 的 host number[ 大約兩千四百萬個位址左右 ] 這是一個 "Class A"(A 級 ) 的網路 ; 相對則是一個 "Class C"(C 級 ) 的網路,network 有三個 bytes 而 host 只有一個 byte[256 個 hosts, 而且還要再扣掉兩個保留的位址 ] 所以, 如同你所看到的, 只有一些 Class A 網路, 一大堆的 Class C 網路, 以及一些中等的 Class B 網路 IP address 的網段部分由 netmask( 網路遮罩 ) 決定, 你可以將 IP address 與 netmask 進行 AND 位元運算, 就能得到 network 的值 Netmask 一般看起來像是 [ 如 : 若你的 IP 是 , 那麼使用這個 netmask 時, 你的 network 就會是 AND 所得到的值 : ] 無庸置疑的, 這樣的分級對於 Internet 的最終需求而言並不夠細膩 ; 我們已經以相當快的速度在消耗 Class C 網路, 這是我們都知道一定會耗盡的 Class, 所以不用費心去想了 補救的方式是, 要能接受任意個 bits 的 netmask, 而不單純是 8 16 或 24 個而已 所以你可以有個 的 netmask, 這個 netmask 能切出一個 30 個 bits 的 network 及 2 個 bits 的 host, 這個 network 最多有四台 hosts[ 注意,netmask 的格式永遠都是 : 前面是一連串的 1, 然後, 後面是一連串的 0] 不過一大串的數字會有點不好用, 比如像 這樣的 netmask 首要是人們無法直觀地知道有多少個 bits 的 1; 其次是這樣真的很不嚴謹 因此, 後來的新方法就好多了 你只需要將一個斜線放在 IP address 後面, 接著後面跟著一個十進制的數字用以表示 network bits 的數目, 類似這樣 : /30 或者在 IPv6 中, 類似這樣 :2001:db8::/32 或 2001:db8:5413:4028::9db9/ Port Number( 連接埠號碼 ) 如果你還記得我之前跟你說過的分層網路模型 (Layered Network Model), 它將網路層 (IP) 與主機到主機間的傳輸層 [TCP 與 UDP] 分開 我們要加快腳步了 24

25 除了 IP address 之外 [IP 層 ], 有另一個 TCP[stream socket] 使用的位址, 剛好 UDP[datagram socket] 也用這個, 就是 port number, 這是一個 16 bit 的數字, 就像是連線的本地端位址一樣 將 IP address 想成飯店的地址, 而 port number 就是飯店的房間號碼 這是貼切的比喻 ; 或許以後我會用汽車工業來比喻 你說想要有一台電腦能處理收到的電子郵件與網頁服務 - 你要如何在一台只有一個 IP address 的電腦上分辨這些封包呢? 好,Internet 上不同的服務都有已知的 (well known)port numbers 你可以在 Big IANA Port 清單 [12] 中找到, 如果你用的是 Unix 系統, 你可以參考檔案 /etc/services HTTP( 網站 ) 是 port 80 telnet 是 port 23 SMTP 是 port 25, 而 DOOM 遊戲 [13] 使用 port 666 等, 諸如此類 Port 1024 以下通常是有特地用途的, 而且要有作業系統管理員權限才能使用 摁, 這就是 port number 的介紹 [12] numbers [13] Byte Order( 位元組順序 ) 一直都以為有兩種 byte orderings, 現在才知道, 其實只有一種 開玩笑的, 但是其中一個的確比較受推崇 : ) 這真的不容易解釋, 所以我只能胡扯 : 你的電腦可能背著你用相反的順序來儲存 bytes 我知道! 以前沒人跟你說過 Byte Order 其實就是, 若你想要用兩個 bytes 的十六進制數字來表示資料, 比如說 b34f, 你可以將它以 b34f 的順序儲存, 這件事在 Internet 世界的每個人一般都可以同意 這很合理, 而且 Wilford Brimley [14] 也會跟你說, 這麼做是對的 由於這個數字是先儲存比較大的那一邊 (big end), 所以稱為 Big Endian 不幸的是, 世界上的電腦那麼多, 而 Intel 或 Intel 相容處理器就將 bytes 反 25

26 過來儲存, 所以 b34f 存在記憶體中的順序就是 4fb3, 這樣的儲存方式稱為 Little Endian 不過, 請等等 我還沒解釋名詞哩! 照理說,Big Endian 又稱為 Network Byte Order, 因為這個順序與我們網路類型順序一樣 你的電腦會以 Host Byte Order 儲存數字, 如果是 Intel 80x86,Host Byte Order 是 Little Endian; 若是 Motorola 68k, 則 Host Byte Order 是 Big Endian; 若是 PowerPC,Host Byte Order 就是 恩, 這要看你的 PowerPC 而定 大多數當你在打造封包或填寫資料結構時, 你需要確認你的 port number 跟 IP address 都是 Network Byte Order 只是如果你不知道本機的 Host Byte Order, 那該怎麼做呢? 好消息是, 我們可以直接假設, 全部電腦的 Host Byte Order 都不是 Network Byte Order, 然後每次都用函式將值轉換為 Network Byte Order 如果有必要, 函式會發動魔法般的轉換, 而這個方式會讓你的程式碼能更方便地移植到不同 endian 的機器 你可以轉換兩種型別的數值 :short[ 兩個 bytes] 與 long[ 四個 bytes] 這些函式也可以用在 unsigned 變數 比如說, 你想要將 short 從 Host Byte Order 轉換為 Network Byte Order, 'h' 代表 "host", 'n' 代表 "network", 而 's' 代表 "short", 所以是 :h to n s, 或者 htons()[ 讀做 :"Host to Network Short"] 這真是太簡單了 你可以用任何你想要的方式來組合 'n' 'h' 's' 與 'l', 不過別用太蠢的組合, 比如 : 沒有這樣的函式 stolh()["short to Long Host"], 沒有這種東西, 不過有下面這些 : htons() host to network short htonl() host to network long ntohs() network to host short ntohl() network to host long 基本上, 你需要在送出封包以前將數值轉換為 Network Byte Order, 並在收到封包之後將數值轉回 Host Byte Order 26

27 抱歉, 我不知道 64 bit 的差異, 如果你想要處理浮點數的話, 可以參考 7.4 節 [14] 如果我沒特別強調的話, 本文中的數值預設是視為 Host Byte Order 3.3. 資料結構 很好, 終於講到這裡了, 該是談談程式設計的時間了 在本節, 我會介紹 socket 介面的各種資料型別, 因為它們有些會不太好理解 首先是最簡單的 :socket descriptor, 型別如下 : int 就是一般的 int 從這裡開始會有點不好理解, 所以不用問太多, 直接讀過就好 我的第一個 Struct TM -struct addrinfo, 這個資料結構是最近的發明, 用來準備之後要用的 socket 位址資料結構, 也用在主機名稱 (host name) 及服務名稱 (service name) 的查詢 當我們之後開始實際應用時, 才會開始覺得比較合理, 現在只需要知道你在建立連線呼叫時會用到這個資料結構 struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME 等 ; int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; // SOCK_STREAM, SOCK_DGRAM int ai_protocol; // 用 0 當作 "any" size_t ai_addrlen; // ai_addr 的大小, 單位是 byte struct sockaddr *ai_addr; // struct sockaddr_in 或 _in6 char *ai_canonname; // 典型的 hostname struct addrinfo *ai_next; // 鏈結串列 下個節點 你可以載入這個資料結構, 然後呼叫 getaddrinfo() 它會傳回一個指標, 這個 27

28 指標指向一個新的鏈結串列, 這個串列有一些資料結構, 而資料結構的內容記載了你所需的東西 你可以在 ai_family 欄位中設定強制使用 IPv4 或 IPv6, 或者將它設定為 AF_UNSPEC,AF_UNSPEC 很酷, 因為這樣你的程式就可以不用管 IP 的版本 要注意的是, 這是個鏈結串列 :ai_next 是指向下一個元素 (element), 可能會有多個結果讓你選擇 我會直接用它提供的第一個結果, 不過你可能會有不同的個人考量 ; 先生! 我不是萬事通 你會在 struct addrinfo 中看到 ai_addr 欄位是一個指向 struct sockaddr 的指標 這是我們開始要了解 IP 位址結構中有哪些細節的地方 有時候, 你需要的是呼叫 getaddrinfo() 幫你填好 struct addrinfo 然而, 你必須查看這些資料結構, 並將值取出, 所以我在這邊會進行說明 [ 還有, 在發明 struct addrinfo 以前的程式碼都要手動填寫這些資料的每個欄位, 所以你會看到很多 IPv4 的程式碼真的用很原始的方式去做這件事 你知道的, 本文件在舊版也是這樣做 ] 有些 structs 是 IPv4, 而有些是 IPv6, 有些兩者都是 我會特別註明清楚它們屬於哪一種 總之,struct sockaddr 記錄了很多 sockets 類型的 socket 的位址資訊 struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address ; sa_family 可能是任何東西, 不過在這份文件中我們會用到的是 AF_INET[IPv4] 或 AF_INET6[IPv6] sa_data 包含一個 socket 的目地位址與 port number 這樣很不方便, 因為你不會想要手動的將位址封裝到 sa_data 裡 為了處理 struct sockaddr, 程式設計師建立了對等平行的資料結構 :struct sockaddr_in["in" 是代表 "internet"], 可用在 IPv4 而這邊有個重點 : 指向 struct sockaddr_in 的指標可以轉型 (cast) 為指向 struct 28

29 sockaddr 的指標, 反之亦然 所以即使 connect() 需要一個 struct sockaddr *, 你也可以用 struct sockaddr_in, 並在最後的時候對它做型別轉換! // (IPv4 專用 -- IPv6 請見 struct sockaddr_in6) struct sockaddr_in { ; short int sin_family; // Address family, AF_INET unsigned short int sin_port; // Port number struct in_addr sin_addr; // Internet address unsigned char sin_zero[8]; // 與 struct sockaddr 相同的大小 這個資料結構讓它很容易可以參考 (reference)socket 位址的成員 要注意的是 sin_zero[ 這是用來將資料結構補足符合 struct sockaddr 的長度 ], 應該要使用 memset() 函式將 sin_zero 整個清為零 還有,sin_family 是對應到 struct sockaddr 中的 sa_family, 並應該設定為 "AF_INET" 最後,sin_port 必須是 Network Byte Order[ 利用 htons()] 讓我們再更深入點! 你可以在 struct in_addr 裡看到 sin_addr 欄位 那是什麼? 好, 別太激動, 不過它是其中一個最恐怖的 union: // ( 僅限 IPv4 Ipv6 請參考 struct in6_addr) // Internet address (a structure for historical reasons) struct in_addr { uint32_t s_addr; // that's a 32-bit int (4 bytes) ; 哇! 好耶, 它以前是 union, 不過這個包袱現在似乎已經不見了 因此, 若你已將 ina 宣告為 struct sockaddr_in 的型別時, 那麼 ina.sin_addr.s_addr 會參考到 4 byte 的 IP address( 以 Network Byte Order) 要注意的是, 如果你的系統仍然在 struct in_addr 使用超恐怖的 union, 你依然可以像我上面說的, 精確地參考到 4 byte 的 IP address[ 這是因為有 #define] 那麼 IPv6 會怎樣呢? 29

30 IPv6 也有提供類似的 struct, 比如 : // (IPv6 專用 -- IPv4 請見 struct sockaddr_in 與 struct in_addr) struct sockaddr_in6 { ; u_int16_t sin6_family; // address family, AF_INET6 u_int16_t sin6_port; // port number, Network Byte Order u_int32_t sin6_flowinfo; // IPv6 flow 資訊 struct in6_addr sin6_addr; // IPv6 address u_int32_t sin6_scope_id; // Scope ID struct in6_addr { unsigned char s6_addr[16]; // IPv6 address ; 要注意到 IPv6 協定有一個 IPv6 address 與一個 port number, 就像 IPv4 協定有一個 IPv4 address 與 port number 一樣 我現在還不會介紹 IPv6 的流量資訊, 或是 Scope ID 欄位 畢竟這只是一份入門文件嘛 : ) 最後要強調的一點, 這個簡單的 struct sockaddr_storage 設計用來足以儲存 IPv4 與 IPv6 structures 的 structure [ 你看看, 對於某些 calls, 你有時無法事先知道它是否會使用 IPv4 或 IPv6 address 來填好你的 struct sockaddr 所以你用這個平行的 structure 來傳遞, 它除了比較大以外, 也很類似 struct sockaddr, 因而可以將它轉型為你所需的型別 ] struct sockaddr_storage { ; sa_family_t ss_family; // address family // 這裡都是填充物 (padding), 依實作而定, 請忽略它 : char ss_pad1[_ss_pad1size]; int64_t ss_align; char ss_pad2[_ss_pad2size]; 重點是你可以在 ss_family 欄位看到位址家族 (address family), 檢查它是 AF_INET 或 AF_INET6( 是 IPv4 或 IPv6) 之後如果你願意的話, 你就可以將它轉型為 sockaddr_in 或 struct sockaddr_in6 30

31 3.4. IP 位址, 續集 還好你運氣不錯, 有一堆函式讓你能夠控制 IP address, 而不需要親自用 long 與 << 運算符來處理它們 咱們說, 你有一個 struct sockaddr_in ina, 而且你有一個 " " 或 "2001:db8:63b3:1::3490" 這樣的一個 IP address 要儲存 你想要使用 inet_pton() 函式將 IP address 轉換為數值與句號的符號, 並依照你指定的 AF_INET 或 AF_INET6 來決定要儲存在 struct in_addr 或 struct in6_addr ["pton" 的意思是 "presentation to network", 你可以稱之為 "printable to network", 如果這樣會比較好記的話 ] 這樣的轉換可以用如下的方式 : struct sockaddr_in sa; // IPv4 struct sockaddr_in6 sa6; // IPv6 inet_pton(af_inet, " ", &(sa.sin_addr)); // IPv4 inet_pton(af_inet6, "2001:db8:63b3:1::3490", &(sa6.sin6_addr)); // IPv6 [ 小記 : 原本的老方法是使用名為 inet_addr() 或是 inet_aton() 的函式 ; 這些都過時了, 而且不適合在 IPv6 中使用 ] 目前上述的程式碼片段還不是很可靠, 因為沒有錯誤檢查 inet_pton() 在錯誤時會傳回 1, 而若位址被搞爛了, 則會傳回 0 所以在使用之前要檢查, 並確認結果是大於 0 的 好了, 現在你可以將 IP address 字串轉換為它們的二進位表示 還有其它方法嗎? 如果你有一個 struct in_addr 且你想要以數字與句號印出來的話呢? [ 呵呵, 或者如果你想要以 " 十六進位與冒號 " 印出 struct in6_addr] 在這個例子中, 你會想要使用 inet_ntop() 函式 ["ntop" 意謂 "network to presentation" - 如果有比較好記的話, 你可以稱它為 "network to printable"], 像是這樣 : 31

32 // IPv4: char ip4[inet_addrstrlen]; // 儲存 IPv4 字串的空間 struct sockaddr_in sa; // 假裝這會由某個東西載入 inet_ntop(af_inet, &(sa.sin_addr), ip4, INET_ADDRSTRLEN); printf("the IPv4 address is: %s\n", ip4); // IPv6: char ip6[inet6_addrstrlen]; // 儲存 IPv6 字串的空間 struct sockaddr_in6 sa6; // 假裝這會由某個東西載入 inet_ntop(af_inet6, &(sa6.sin6_addr), ip6, INET6_ADDRSTRLEN); printf("the address is: %s\n", ip6); 當你呼叫它時, 你會傳遞位址的型別 [IPv4 或 IPv6], 該位址是一個指向儲存結果的字串, 與該字串的最大長度 [ 有兩個 macro( 巨集 ) 可以很方便地儲存你想儲存的最大 IPv4 或 IPv6 位址字串大小 :INET_ADDRSTRLEN 與 INET6_ADDRSTRLEN] [ 另一個要再次注意的是以前的方法 : 以前做這類轉換的函式名為 inet_ntoa(), 它已經過期了, 而也在 IPv6 中也不適用 ] 最後, 這些函式只能用在數值的 IP address 上, 它們不需要 DNS nameserver 來查詢主機名稱, 如 " 你可以使用 getaddrinfo() 來做這件事情, 如同你稍後會看到的 Private Network 很多地方都有防火牆 (firewall), 它們保護網路, 將網路隱藏於世界的某個地方 有時, 防火牆會用所謂的網路位址轉換 (NAT,Network Address Translation) 的方法, 將 "internal"( 內部的 )IP 位址轉換為 "external"( 外部的 )[ 世界上的每個人都知道的 ]IP address 你又開始緊張了嗎?" 他又要扯到哪裡去了?" 好啦, 放輕鬆, 去買瓶汽水 [ 或酒精 ] 飲料, 因為身為一個初學者, 你還可以先別理 NAT, 因為它所做的事情對你而言是透明的 不過我想在你開始對所見的網路數量開始感到困惑以前, 先談談防火牆後面的網路 比如, 我家有一個防火牆, 我有兩個 DSL 電信公司分配給我的靜態 IPv4 位 32

33 址, 而我家的網路有七部電腦要用 這有可能嗎? 兩台電腦不能共用同一個 IP address 阿, 不然資料就不知道該送去哪一台電腦了! 答案揭曉 : 它們不會共用同一個 IP address, 它們是在一個擁有兩千四百萬個 IP address 的 private network 裡面, 這些 IP addresses 全部都是我的 好, 都是你的, 有這麼多位址可以讓大家用來上網, 而這裡要講的就是為什麼 : 如果我登入到一台遠端的電腦, 它會說我從 登入, 這是我的 ISP 提供給我的 public IP 不過若是我問我自己本地端的電腦, 它的 IP address 是什麼時, 他會說是 是誰轉換 IP 的呢? 答對了, 就是防火牆! 它做了 NAT! 10.x.x.x 是其中一個少數保留的網路, 只能用在完全無法連上 Internet 的網路 [disconnected network], 或是在防火牆後的網路 你可以使用哪個 private network 編號的細節是記在 RFC 1918 [15] 中, 不過一般而言, 你較常見的是 10.x.x.x 及 x.x, 這裡的 x 是指 較少見的是 172.y.x.x, 這裡的 y 範圍在 16 與 31 之間 在 NAT 防火牆後的網路可以不必用這些保留的網路, 不過它們通常會用 [ 真好玩! 我的外部 IP 真的不是 , x 網段保留用來虛構本文要用的 " 真實 "IP address, 就像本文也是虛構的一樣 Wowzers!] IPv6 也很合理的會有 private network 它們是以 fdxx: 開頭 [ 或者未來可能是 fcxx:], 如同 RFC 4193 [16] NAT 與 IPv6 通常不會混用, 然而 [ 除非你在做 IPv6 轉 IPv4 的 gateway, 這就不在本文的討論範圍內了 ], 理論上, 你會有很多位址可以使用, 所以根本不再需要使用 NAT 不過, 如果你想要在不會遶送到外面的網路 [ 封閉網路 ] 上配置位址給你自己, 就用 NAT 吧 [15] [16] 33

34 4. 從 IPv4 移植為 IPv6 " 可是我只想知道要怎麼改程式碼的哪些地方就可以支援 IPv6 了! 快點告訴我!" OK!OK! 我幾乎都是以過來人的身分來講這邊的每件事, 這次不考驗各位的耐心, 來個簡潔的短文 [ 當然有更多比這篇短的文章, 不過我是跟自己的這份文件來比較 ] 1. 首先, 請試著用 getaddrinfo() 來取得 struct sockaddr 的資訊, 取代手動填寫這個資料結構 這樣你就可以不用管 IP 的版本, 而且能節省後續許多步驟 2. 找出全部與 IP 版本相關的任何程式碼, 試著用一個有用的函式將它們包起來 (wrap up) 3. 將 AF_INET 更改為 AF_INET6 4. 將 PF_INET 更改為 PF_INET6 5. 將 INADDR_ANY 更改為 in6addr_any, 這裡有點不太一樣 : struct sockaddr_in sa; struct sockaddr_in6 sa6; sa.sin_addr.s_addr = INADDR_ANY; // 使用我的 IPv4 位址 sa6.sin6_addr = in6addr_any; // 使用我的 IPv6 位址 還有, 在宣告 struct in6_addr 時,IN6ADDR_ANY_INIT 的值可以做為初始值, 像這樣 : struct in6_addr ia6 = IN6ADDR_ANY_INIT; 6. 使用 struct sockaddr_in6 取代 struct sockaddr_in, 確定要將 "6" 新增到適當的欄位 [ 參考上面的 structs], 但沒有 sin6_zero 欄位 7. 使用 struct in6_addr 取代 struct in_addr, 要確定有將 "6" 新增到適當的 34

35 欄位 [ 參考上面的 structs] 8. 使用 inet_pton() 取代 inet_aton() 或 inet_addr() 9. 使用 inet_ntop() 取代 inet_ntoa() 10. 使用很讚的 getaddrinfo() 取代 gethostbyname() 11. 使用很讚的 getnameinfo() 取代 gethostbyaddr()[ 雖然 gethostbyaddr() 在 IPv6 中也能正常運作 ] 12. 不要用 INADDR_BROADCAST 了, 請愛用 IPv6 multicast 來替代 就是這樣 譯註 : IPv6 可參考萩野純一郎, IPv6 網路程式設計, 博碩, System call 或 Bust 我們在本章開始討論如何讓你存取 UNIX 系統或 BSD Windows Linux Mac 等系統的 system call( 系統呼叫 ) socket API 及其它 function calls( 函式呼叫 ) 等網路功能 當你呼叫其中一個函式時,kernel 會接管, 並且自動幫你處理全部的工作 多數人會卡在這裡是因為不知道要用什麼樣的順序來呼叫這些函式, 而你在找 man 使用手冊時會覺得手冊很難用 好的, 為了要幫忙解決這可怕的困境, 我已經試著在下列的章節精確地勾勒出 (layout) system call, 你在寫程式時只要照著一樣的順序呼叫就可以了 為了要連結一些程式碼, 需要一些牛奶跟餅乾 [ 這恐怕你要自行準備 ], 以及一些決心與勇氣, 而你就能將資料發送到網際網路上, 彷彿是 Jon Postel 之子般 [ 請注意, 為了簡潔, 下列許多程式碼片段並沒有包含錯誤檢查的程式碼 而且它們很愛假設呼叫 getaddrinfo() 的結果都會成功, 並會傳回鏈結串列 (link list) 中的一個有效資料 這兩種情況在單獨執行的程式都有嚴謹的定 35

36 位, 所以, 還是將它們當作模型來使用吧 ] 5.1. getaddrinfo()- 準備開始! 這是個有很多選項的工作馬 (workhorse) 函式, 但是卻相當容易上手 它幫你設定之後需要的 struct 談點歷史 : 它前身是你用來做 DNS 查詢的 gethostbyname() 而當時你需要手 動將資訊載入 struct sockaddr_in, 並在你的呼叫中使用 感謝老天, 現在已經不用了 [ 如果你想要設計能通用於 IPv4 與 IPv6 的程式也不用!] 在現代, 你有 getaddrinfo() 函式, 可以幫你做許多事情, 包含 DNS 與 service name 查詢, 並填好你所需的 structs 讓我們來看看! #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *node, // 例如 : " 或 IP const char *service, // 例如 : "http" 或 port number const struct addrinfo *hints, struct addrinfo **res); 你給這個函式三個輸入參數, 結果它會回傳給你一個指向鏈結串列的指標 - res node 參數是要連線的主機名稱, 或者一個 IP address( 位址 ) 下一個參數是 service, 這可以是 port number, 像是 "80", 或者特定服務的名稱 [ 可以在你 UNIX 系統上的 IANA Port List [17] 或 /etc/services 檔案中找到 ], 像是 "http" 或 "ftp" 或 "telnet" 或 "smtp" 諸如此類的 最後,hints 參數指向一個你已經填好相關資訊的 struct addrinfo 這裡是一個呼叫範例, 如果你是一部 server( 伺服器 ), 想要在你主機上的 IP address 及 port 3490 執行 listen 要注意的是, 這邊實際上沒有做任何的 36

37 listening 或網路設定 ; 它只有設定我們之後要用的 structures 而已 int status; struct addrinfo hints; struct addrinfo *servinfo; // 將指向結果 memset(&hints, 0, sizeof hints); // 確保 struct 為空 hints.ai_family = AF_UNSPEC; // 不用管是 IPv4 或 IPv6 hints.ai_socktype = SOCK_STREAM; // TCP stream sockets hints.ai_flags = AI_PASSIVE; // 幫我填好我的 IP if ((status = getaddrinfo(null, "3490", &hints, &servinfo))!= 0) { fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); exit(1); // servinfo 目前指向一個或多個 struct addrinfos 的鏈結串列 //... 做每件事情, 一直到你不再需要 servinfo... freeaddrinfo(servinfo); // 釋放這個鏈結串列 注意一下, 我將 ai_family 設定為 AF_UNSPEC, 這樣代表我不用管我們用的是 IPv4 或 IPv6 address 如果你想要指定的話, 你可以將它設定為 AF_INET 或 AF_INET6 還有, 你會在這裡看到 AI_PASSIVE 旗標 ; 這個會告訴 getaddrinfo() 要將我本機的位址 (address of local host) 指定給 socket structure 這樣很棒, 因為你就不用把位址寫死了 [ 或者你可以將特定的位址放在 getaddrinfo() 的第一個參數中, 我現在寫 NULL 的那個參數 ] 然後我們執行呼叫, 若有錯誤發生時 [getaddrinfo 會傳回非零的值 ], 如你所見, 我們可以使用 gai_strerror() 函式將錯誤印出來 若每件事情都正常運作, 那麼 serinfo 就會指向一個 struct addrinfos 的鏈結串列, 串列中的每個成員都會包含一個我們之後會用到的某種 struct sockaddr 最後, 當我們終於使用 getaddrinfo() 配置的鏈結串列完成工作後, 我們可以 [ 也應該 ] 要呼叫 freeaddrinfo() 將鏈結串列全部釋放 37

38 這邊有一個呼叫範例, 如果你是一個想要連線到特定 server 的 client( 客戶端 ), 比如是 :" 的 port 3490 再次強調, 這裡並沒有真的進行連線, 它只是設定我們之後要用的 structure int status; struct addrinfo hints; struct addrinfo *servinfo; // 將指向結果 memset(&hints, 0, sizeof hints); // 確保 struct 為空 hints.ai_family = AF_UNSPEC; // 不用管是 IPv4 或 IPv6 hints.ai_socktype = SOCK_STREAM; // TCP stream sockets // 準備好連線 status = getaddrinfo(" "3490", &hints, &servinfo); // servinfo 現在指向有一個或多個 struct addrinfos 的鏈結串列 我一直說 serinfo 是一個鏈結串列, 它有各種的位址資訊 讓我們寫一個能快速 demo 的程式, 來呈現這個資訊 這個小程式 [18] 會印出你在命令列中所指定的主機之 IP address: /* ** showip.c -- 顯示命令列中所給的主機 IP address */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> #include <netinet/in.h> int main(int argc, char *argv[]) { struct addrinfo hints, *res, *p; int status; char ipstr[inet6_addrstrlen]; 38

39 if (argc!= 2) { fprintf(stderr,"usage: showip hostname\n"); return 1; 本 memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // AF_INET 或 AF_INET6 可以指定版 hints.ai_socktype = SOCK_STREAM; if ((status = getaddrinfo(argv[1], NULL, &hints, &res))!= 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); return 2; printf("ip addresses for %s:\n\n", argv[1]); for(p = res;p!= NULL; p = p->ai_next) { void *addr; char *ipver; // 取得本身位址的指標, // 在 IPv4 與 IPv6 中的欄位不同 : if (p->ai_family == AF_INET) { // IPv4 struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; addr = &(ipv4->sin_addr); ipver = "IPv4"; else { // IPv6 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; addr = &(ipv6->sin6_addr); ipver = "IPv6"; // convert the IP to a string and print it: inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); 39

40 printf(" %s: %s\n", ipver, ipstr); freeaddrinfo(res); // 釋放鏈結串列 return 0; 如你所見, 程式碼使用你在命令列輸入的參數呼叫 getaddrinfo(), 它填好 res 所指的鏈結串列, 並接著我們就能重複那行並印出東西或做點類似的事 [ 有點不好意思! 我們在討論 struct sockaddrs 它的型別差異是因 IP 版本而異之處有點鄙俗 我不確定是否有較優雅的方法 ] 在下面執行範例! 來看看大家喜歡看的執行畫面 : $ showip IP addresses for IPv4: $ showip ipv6.example.com IP addresses for ipv6.example.com: IPv4: IPv6: 2001:db8:8c00:22::171 現在已經在我們的掌控之下, 我們會將 getaddrinfo() 傳回的結果送給其它的 socket 函式, 而且終於可以建立我們的網路連線了! 讓我們繼續看下去! [17] numbers [18] [19] socket()- 取得 File Descriptor! 我想可以不用再將 socket() 晾在旁邊了, 我一定要講一下 socket() system 40

41 call, 這邊是程式片段 : #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 可是這些參數是什麼? 它們可以讓你設定想要的 socket 類型 [IPv4 或 IPv6,stream 或 datagram 以及 TCP 或 UDP] 以前的人得寫死這些值, 而你也可以這樣做 [domain 是 PF_INET 或 PF_INET6,type 是 SOCK_STREAM 或 SOCK_DGRAM, 而 protocol 可以設定為 0, 用來幫給予的 type 選擇適當的協定 或者你可以呼叫 getprotobyname() 來查詢你想要的協定,"tcp" 或 "udp"] [PF_INET 就是你在初始化 struct sockaddr_in 的 sin_family 欄位會用到的, 它是 AF_INET 的親戚 實際上, 它們的關係很近, 所以其實它們的值也都一樣, 而許多程式設計師會呼叫 socket(), 並以 AF_INET 取代 PF_INET 來做為第一個參數傳遞 現在, 你可以去拿點牛奶跟餅乾, 因為又是說故事時間了 在很久很久以前, 人們認為它應該是位址家族 (address family), 就是 "AF_INET" 中的 "AF" 所代表的意思 ; 而位址家族也要支援協定家族 (protocol family) 的幾個協定, 這件事並沒有發生, 而之後它們都過著幸福快樂的日子, 結束 所以最該做的事情就是在你的 struct sockaddr_in 中使用 AF_INET, 而在呼叫 socket() 時使用 PF_INET ] 總之, 這樣就夠了 你真的該做的只是使用呼叫 getaddrinfo() 得到的值, 並將這個值直接餵給 socket(), 像這樣 : int s; struct addrinfo hints, *res; // 執行查詢 // [ 假裝我們已經填好 "hints" struct] getaddrinfo(" "http", &hints, &res); 41

42 // [ 再來, 你應該要對 getaddrinfo() 進行錯誤檢查, // 並走到 "res" 鏈結串列查詢能用的資料, // 而不是假設第一筆資料就是好的 [ 像這些範例一樣 ] // 實際的範例請參考 client/server 章節 s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); socket() 單純傳回給你一個之後 system call 要用的 socket descriptor, 錯誤時會回傳 1 errno 全域變數會設定為該錯誤的值 [ 細節請見 errno 的 man 使用手冊, 而且你需要繼續閱讀並執行更多與它相關的 system call, 這樣會比較有感覺 ] 5.3. bind()- 我在哪個 port? 一旦你有了一個 socket, 你會想要將這個 socket 與你本機上的 port 進行關聯 [ 如果你正想要 listen() 特定 port 進入的連線, 通常都會這樣做, 比如 : 多人網路連線遊戲在它們告訴你 " 連線到 port 3490" 時這麼做 ] port number 是用來讓 kernel 可以比對出進入的封包是屬於哪個 process 的 socket descriptor 如果你只是正在進行 connect()[ 因為你是 client, 而不是 server], 這可能就不用 不過還是可以讀讀, 好玩嘛 #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, int addrlen); sockfd 是 socket() 傳回的 socket file descriptor my_addr 是指向包含你的位址資訊 名稱及 IP address 的 struct sockaddr 之指標 addrlen 是以 byte 為單位的位址長度 呼! 有點比較好玩了 我們來看一個範例, 它將 socket bind( 綁定 ) 到執行程式的主機上,port 是 3490: struct addrinfo hints, *res; int sockfd; // 首先, 用 getaddrinfo() 載入位址結構 : memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever 42

43 hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // fill in my IP for me getaddrinfo(null, "3490", &hints, &res); // 建立一個 socket: sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); // 將 socket bind 到我們傳遞給 getaddrinfo() 的 port: bind(sockfd, res->ai_addr, res->ai_addrlen); 使用 AI_PASSIVE 旗標, 我可以跟程式說要 bind 它所在主機的 IP 如果你想要 bind 到指定的本地 IP address, 捨棄 AI_PASSIVE, 並改放一個位址到 getaddrinfo() 的第一個參數 bind() 在錯誤時也會傳回 1, 並將 errno 設定為該錯誤的值 許多舊程式都在呼叫 bind() 以前手動封裝 struct sockaddr_in 很顯然地, 這是 IPv4 才有的, 可是真的沒有辦法阻止你在 IPv6 做一樣的事情, 一般來說, 使用 getaddrinfo() 會比較簡單 總之, 舊版的程式看起來會像這樣 : //!!! 這是老方法!!! int sockfd; struct sockaddr_in my_addr; sockfd = socket(pf_inet, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(myport); // short, network byte order my_addr.sin_addr.s_addr = inet_addr(" "); memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero); bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr); 在上列的程式碼中, 如果你想要 bind 到你本機的 IP address[ 就像上面的 AI_PASSIVE 旗標 ], 你也可以將 INADDR_ANY 指定給 s_addr 欄位 43

44 INADDR_ANY 的 IPv6 版本是一個 in6addr_any 全域變數, 它會被指定給你的 struct sockaddr_in6 的 sin6_addr 欄位 [ 也有一個你能用於變數初始器 (variable initializer) 的 IN6ADDR_ANY_INIT macro( 巨集 )] 另一件呼叫 bind() 時要小心的事情是 : 不要用太小的 port number 全部 1024 以下的 ports 都是保留的 [ 除非你是系統管理員 ]! 你可以使用任何 1024 以上的 port number, 最高到 65535[ 提供尚未被其它程式使用的 ] 你可能有注意到, 有時候你試著重新執行 server, 而 bind() 卻失敗了, 它聲稱 "Address already in use."( 位址使用中 ) 這是什麼意思呢? 很好, 有些連接到 socket 的連線還懸在 kernel 裡面, 而它佔據了這個 port 你可以等待它自行清除 [ 一分鐘之類 ], 或者在你的程式中新增程式碼, 讓它重新使用這個 port, 類似這樣 : int yes=1; //char yes='1'; // Solaris 的使用者用這個 // 可以跳過 "Address already in use" 錯誤訊息 if (setsockopt(listener,sol_socket,so_reuseaddr,&yes,sizeof(int)) == -1) { perror("setsockopt"); exit(1); 最後一個對 bind() 的額外小提醒 : 在你不願意呼叫 bind() 時 若你正使用 connect() 連線到遠端的機器, 你可以不用管 local port 是多少 ( 以 telnet 為例, 你只管遠端的 port 就好 ), 你可以單純地呼叫 connect(), 它會檢查 socket 是否尚未綁定 (unbound), 並在有需要的時候自動將 socket bind() 到一個尚未使用的 local port 5.4. connect(), 嘿! 你好 咱們用幾分鐘的時間假裝你是個 telnet 應用程式, 你的使用者命令你 [ 就像 TRON 電影裡那樣 ] 取得一個 socket file descriptor 你執行並呼叫 socket() 接著使用者告訴你連線到 " " 的 port 23[ 標準 telnet port] 喲! 你現在該做什麼呢? 44

45 你是很幸運的程式, 你現在可以細讀 connect() 的章節, 如何連線到遠端主機 所以努力往前讀吧! 刻不容緩! connect() call 如下 : #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); sockfd 是我們的好鄰居 socket file descriptor, 如同 socket() 呼叫所傳回的, serv_addr 是一個 struct sockaddr, 包含了目的 port 及 IP 位址, 而 addrlen 是以 byte 為單位的 server 位址結構之長度 全部的資訊都可以從 getaddrinfo() 呼叫中取得, 它很棒 這樣有開始比較有感覺了嗎? 我在這裡沒辦法知道, 所以我只能希望是這樣沒錯 我們有個範例, 這邊我們用 socket 連線到 " 的 port 3490: struct addrinfo hints, *res; int sockfd; // 首先, 用 getaddrinfo() 載入 address structs: memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; getaddrinfo(" "3490", &hints, &res); // 建立一個 socket: sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); // connect! 45

46 connect(sockfd, res->ai_addr, res->ai_addrlen); 老學校的程式再次填滿了它們自己的 struct sockaddr_ins 並傳給 connect() 如果你願意的話, 你可以這樣做 請見上面 bind() 章節中類似的提點 要確定有檢查 connect() 的回傳值, 它在錯誤時會傳回 1, 並設定 errno 變數 還要注意的是, 我們不會呼叫 bind() 基本上, 我們不用管我們的 local port number; 我們只在意我們的目地 [ 遠端 port] Kernel 會幫我們選擇一個 local port, 而我們要連線的站台會自動從我們這裡取得資訊, 不用擔心 5.5. listen()- 有人會呼叫我嗎? OK, 是該改變步調的時候了 如果你不想要連線到一個遠端主機要怎麼做 我說過, 好玩就好, 你想要等待進入的連線, 並以某種方式處理它們 這個過程有兩個步驟 : 你要先呼叫 listen(), 接著呼叫 accept()[ 參考下一節 ] listen 呼叫相當簡單, 不過需要一點說明 : int listen(int sockfd, int backlog); sockfd 是來自 socket() system call 的一般 socket file descriptor backlog 是進入的佇列 (incoming queue) 中所允許的連線數目 這代表什麼意思呢? 好的, 進入的連線將會在這個佇列中排隊等待, 直到你 accept() 它們 ( 請見下節 ), 而這限制了排隊的數量 多數的系統預設將這個數值限制為 20; 你或許可以一開始就將它設定為 5 或 10 再來, 如同往常,listen() 會傳回 1 並在錯誤時設定 errno 好的, 你可能會想像, 我們需要在呼叫 listen() 以前呼叫 bind(), 讓 server 可以在指定的 port 上執行 [ 你必須能告訴你的好朋友要連線到哪一個 port!] 所以如果你正在 listen 進入的連線, 你會執行的 system call 順序是 : 46

47 getaddrinfo(); socket(); bind(); listen(); /* accept() 從這裡開始 */ 我只是留下範例程式的位置, 因為它相當顯而易見 [ 在下面 accept() 章節中的程式碼會比較完整 ] 這整件事情真正需要技巧的部分是呼叫 accept() 5.6. accept()- 謝謝你 call 3490 port 準備好,accept() call 是很奇妙的! 會發生的事情就是 : 很遠的人會試著 connect() 到你的電腦正在 listen() 的 port 他們的連線會排隊等待被 accept() 你呼叫 accept(), 並告訴它要取得擱置的 (pending) 連線 它會傳回給你專屬這個連線的一個新 socket file descriptor! 那是對的, 你突然有了兩個 socket file descriptor! 原本的 socket file descriptor 仍然正在 listen 後續的連線, 而新建立的 socket file descriptor 則是在最後要準備給 send() 與 recv() 用的 呼叫如下 : #include <sys/types.h> #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockfd 是正在進行 listen() 的 socket descriptor 很簡單,addr 通常是一個指向 local struct sockaddr_storage 的指標, 關於進來的連線將往哪裡去的資訊 [ 而你可以用它來得知是哪一台主機從哪一個 port 呼叫你的 ] addrlen 是一個 local 的整數變數, 應該在將它的位址傳遞給 accept() 以前, 將它設定為 sizeof(struct sockaddr_storage) accept() 不會存放更多的 bytes( 位元組 ) 到 addr 若它存放了較少的 bytes 進去, 它會改變 addrlen 的值來表示 有想到嗎?accept() 在錯誤發生時傳回 1 並設定 errno 不過 BetCha 不這麼認為 跟以前一樣, 用一段程式範例會比較好吸收, 所以這裡有一段範例程供你細讀 : 47

48 #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define MYPORT "3490" // 使用者將連線的 port #define BACKLOG 10 // 在佇列中可以有多少個連線在等待 int main(void) { struct sockaddr_storage their_addr; socklen_t addr_size; struct addrinfo hints, *res; int sockfd, new_fd; //!! 不要忘了幫這些呼叫做錯誤檢查!! // 首先, 使用 getaddrinfo() 載入 address struct: memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // 使用 IPv4 或 IPv6, 都可以 hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // 幫我填上我的 IP getaddrinfo(null, MYPORT, &hints, &res); // 產生一個 socket,bind socket, 並 listen socket: sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); bind(sockfd, res->ai_addr, res->ai_addrlen); listen(sockfd, BACKLOG); // 現在接受一個進入的連線 : addr_size = sizeof their_addr; new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size); 48

49 // 準備好與 new_fd 這個 socket descriptor 進行溝通!... 一樣, 我們會將 new_fd socket descriptor 用於 send() 與 recv() 呼叫 若你只是要取得一個連線, 你可以用 close() 關閉正在 listen 的 sockfd, 以避免有更多的連線進入同樣的 port, 若你有這個需要的話 5.7. send() 與 recv()- 寶貝, 我們來聊天! 這兩個用來通信的函式是透過 stream socket 或 connected datagram ssocket 若你想要使用常規的 unconnected datagram socket, 你會需要參考底下的 sendto() 及 recvfrom() 的章節 send() call: int send(int sockfd, const void *msg, int len, int flags); sockfd 是你想要送資料過去的 socket descriptor[ 不論它是不是 socket() 傳回的, 或是你用 accept() 取得的 ] msg 是一個指向你想要傳送資料之指標, 而 len 是以 byte 為單位的資料長度 而 flags 設定為 0 就好 [ 更多相關的旗標資訊請見 send() man 使用手冊 ] 一些範例程式如下 : char *msg = "Beej was here!"; int len, bytes_sent;... len = strlen(msg); bytes_sent = send(sockfd, msg, len, 0);... send() 會傳回實際有送出的 byte 數目, 這可能會少於你所要傳送的數目! 有時候你告訴 send() 要送整筆的資料, 而它就是無法處理這麼多資料 它只會 49

50 盡量將資料送出, 並認為你之後會再次送出剩下沒送出的部分 要記住, 如果 send() 傳回的值與 len 的值不符合的話, 你就需要再送出字串剩下的部分 好消息是 : 如果封包很小 [ 比 1K 還要小這類的 ], 或許有機會一次就送出全部的東西 一樣, 錯誤時會傳回 1, 並將 errno 設定為錯誤碼 (error number) recv() 呼叫在許多地方都是類似的 : int recv(int sockfd, void *buf, int len, int flags); sockfd 是要讀取的 socket descriptor,buf 是要記錄讀到資訊的緩衝區 (buffer),len 是緩衝區的最大長度, 而 flags 可以再設定為 0 [ 關於旗標資訊的細節請參考 recv() 的 man 使用手冊 ] recv() 傳回實際讀到並寫入到緩衝區的 byte 數, 而錯誤時傳回 1[ 並設定相 對的 errno] 等等! recv() 會傳回 0, 這只能表示一件事情 : 遠端那邊已經關閉了你的連線!recv() 傳回 0 的值是讓你知道這件事情 這樣很簡單, 不是嗎? 你現在可以送回資料, 並往 stream sockets 邁進! 嘻嘻! 你是 UNIX 網路程式設計師了 5.8. sendto() 與 recvfrom()- 來點 DGRAM 我聽到你說," 這全部都是上等的好貨 "," 可是我該如何使用 unconnected datagram socket 呢?" 沒問題, 朋友 我們正要講這件事 因為 datagram socket 沒有連線到到遠端主機, 猜猜看, 我們在送出封包以前會需要哪些資訊呢? 對! 目的位址! 在這裡搶先看 : sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, socklen_t tolen); 50

51 如你所見, 這個呼叫基本上與呼叫 send() 一樣, 只是多了兩個額外的資訊 to 是一個指向 struct sockaddr[ 這或許是另一個你可以在最後轉型的 struct sockaddr_in 或 struct sockaddr_in6 或 struct sockaddr_storage] 的指標, 它包含了目的 IP address 與 port tolen 是一個 int, 可以單純地將它設定為 sizeof *to 或 sizeof(struct sockaddr_storage) 為了能自動處理目的位址結構 (destination address structure), 你或許可以用底下的 getaddrinfo() 或 recvfrom(), 或者你也可以手動填上 如同 send(),sendto() 會傳回實際已傳送的資料數量 ( 一樣, 可能會少於你要傳送的資料量!) 而錯誤時傳回 1 recv() 與 recvfrom() 也是差不多的 recvfrom() 的對照如下 : int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); 一樣, 它跟 recv() 很像, 只是多了兩個欄位 from 是指向 local struct sockaddr_storage 的指標, 這個資料結構包含了封包來源的 IP address 與 port fromlen 是指向 local int 的指標, 應該要初始化為 sizeof *from 或是 sizeof(struct sockaddr_storage) 當函式傳回時,fromlen 會包含實際上儲存於 from 中的位址長度 recvfrom() 傳回接收的資料數目, 或在發生錯誤時傳回 1[ 並設定相對的 errno] 所以這裡有個問題 : 為什麼我們要用 struct sockaddr_storage 做為 socket 的型別呢? 為什麼不用 struct sockaddr_in 呢? 因為你知道的, 我們不想要讓自己綁在 IPv4 或 IPv6, 所以我們使用通用的泛型 struct sockaddr_storage, 我們知道這樣有足夠的空間可以用在 IPv4 與 IPv6 [ 所以... 這裡有另一個問題 : 為什麼不是 struct sockaddr 本身就可以容納任何位址呢? 我們甚至可以將通用的 struct sockaddr_storage 轉型為通用的 struct sockaddr! 似乎沒什麼關係又很累贅啊 答案是, 它就是不夠大, 我猜在這個時候更動它會有問題, 所以他們就弄了一個新的 ] 記住, 如果你 connect() 到一個 datagram socket, 你可以在你全部的交易中只 51

52 使用 send() 與 recv() socket 本身仍然是 datagram socket, 而封包仍然使用 UDP, 但是 socket interface 會自動幫你增加目的與來源資訊 5.9. close() 與 shutdown()- 你消失吧! 呼! 你已經整天都在 send() 與 recv() 了 你正準備要關閉你 socket descriptor 的連線, 這很簡單, 你只要使用常規的 UNIX file descriptor close() 函式 : close(sockfd); 這會避免對 socket 做更多的讀寫 任何想要對這個遠端的 socket 進行讀寫的人都會收到錯誤 如果你想要能多點控制 socket 如何關閉, 可以使用 shutdown() 函式 它讓你可以切斷單向的通信, 或者雙向 [ 就像是 close() 所做的 ], 這是函式原型 : int shutdown(int sockfd, int how); sockfd 是你想要 shutdown 的 socket file descriptor, 而 how 是下列其中一個值 : 0 不允許再接收資料 1 不允許再傳送資料 2 不允許再傳送與接收資料 [ 就像 close()] shutdown() 成功時傳回 0, 而錯誤時傳回 1( 設定相對的 errno) 若你在 unconnected datagram socket 上使用 shutdown(), 它只會單純的讓 socket 無法再進行 send() 與 recv() 呼叫 [ 要記住你只能在有 connect() 到 datagram socket 的時候使用 ] 重要的是 shutdown() 實際上沒有關閉 file descriptor, 它只是改變了它的可用性 如果要釋放 socket descriptor, 你還是需要使用 close() 沒了 [ 除了要記得的是, 如果你用 Windows 與 Winsock, 你應該要呼叫 closesocket() 而不是 close() ] 52

53 5.10. getpeername()- 你是誰? 這個函式很簡單 它太簡單了, 我幾乎不想給它一個獨立的章節, 雖然還是給了 getpeername() 函式會告訴你另一端連線的 stream socket 是誰, 函式原型如下 : #include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); sockfd 是連線的 stream socket 之 descriptor,addr 是指向 struct sockaddr[ 或 struct sockaddr_in] 的指標, 這個資料結構儲存了連線另一端的資訊, 而 addrlen 則是指向 int 的指標, 應該將它初始化為 sizeof *addr 或 sizeof(struct sockaddr) 函式在錯誤時傳回 1, 並設定相對的 errno 一旦你取得了它們的位址, 你就可以用 inet_ntop() getnameinfo() 或 gethostbyaddr() 印出或取得更多的資訊 不過你無法取得它們的登入帳號 [ 好好好, 如果另一台電腦執行的是 ident daemon 就可以 ] 然而, 這個已經超出本文的範圍, 更多資訊請參考 RFC 1413 [19] gethostname()- 我是誰? 比 getpeername() 更簡單的函式是 gethostname(), 它會傳回你執行程式的電腦名稱, 這個名稱之後可以用在 gethostbyname(), 用來定義你本機電腦的 IP address 有什麼更有趣的嗎? 我可以想到一些事情, 不過這不適合 socket 程式設計, 總之, 下面是一段範例 : #include <unistd.h> int gethostname(char *hostname, size_t size); 53

54 參數很簡單 :hostname 是指向字元陣列 (array of chars) 的指標, 它會儲存函式傳回的主機名稱 (hostname), 而 size 是以 byte 為單位的主機名稱長度 函式在成功執行時傳回 0, 在錯誤時傳回 1, 並一樣設定 errno 54

55 6. Client Server 基礎 寶貝, 這是是個 client server( 客戶端 伺服端 ) 世界 單純純與網路處處理 client process( 客戶端行程 ) 及 server process( 伺服服端行程 ) 溝通的每件件事情有關, 反之亦然 以 telnet 為例, 當你用 telnet(client) 連線線到遠端主主機的 port 23 時, 主機上的程式 ( 稱為 telnetd server) 就開開始動了起來, 它會會處理進來的 telnet 連線, 並幫你你設定一個個登入提示示字元等 Client Server 互動 Client 與 server 間的訊息交交換摘錄於於上列的流流程圖中 需要注意的是 client server pair 可以使用 SOCK_STREAM SOCK DGRAM 或其它的 ( 只要要它們用一一樣的協定定來溝通 ) 有一些不不錯的 client server pair 範例, 如 :telnet/telnetd ftp/ftpd 或 Firefox/Apache 每次你你使用 ftp 時, 都會會有一個 ftpd 遠端程式式來為你服服務 一台機器上通常只會會有一個 server, 而該 server 會利用 fork() 來來處理多個 clients 基基本的機制 (routine) 是 :server 會等待連線 accept() 連線線, 並且 fork() 一個 child process( 子行程 ) 來處理此此連線 這這就是我們在下一節的 serverr 範本所做的工工作 55

56 6.1. 簡易的 Stream Server 這個 server 所做的事情就是透過 stream connection( 串流連線 ) 送出 "Hello, World!\n" 字串 你所需要做就是用一個視窗來測試執行 server, 並用另一個視窗來 telnet 到 server: $ telnet remotehostname 3490 這裡的 remotehostname 就是你執行 server 的主機名稱 Server 的程式碼如下 [20]: /* ** server.c 展示一個 stream socket server */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/wait.h> #include <signal.h> #define PORT "3490" // 提供給使用者連線的 port // 有多少個特定的連線佇列 (pending connections queue) #define BACKLOG 10 void sigchld_handler(int s) { while(waitpid(-1, NULL, WNOHANG) > 0); // 取得 sockaddr,ipv4 或 IPv6: 56

57 void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); return &(((struct sockaddr_in6*)sa)->sin6_addr); int main(void) { int sockfd, new_fd; // 在 sock_fd 進行 listen,new_fd 是新的連線 struct addrinfo hints, *servinfo, *p; struct sockaddr_storage their_addr; // 連線者的位址資訊 socklen_t sin_size; struct sigaction sa; int yes=1; char s[inet6_addrstrlen]; int rv; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // 使用我的 IP if ((rv = getaddrinfo(null, PORT, &hints, &servinfo))!= 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; // 以迴圈找出全部的結果, 並綁定 (bind) 到第一個能用的結果 for(p = servinfo; p!= NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("server: socket"); continue; 57

ebook35-21

ebook35-21 21 Linux L i n u x 211 U N I X U N I X I / O F I F O U N I X I n t e r n e t s o c k e t () s o c k e t () send() r e c v ( read() w r i t e () send() r e c v () I n t e r n e t 212 Internet Internet S

More information

Basics of Socket Programming Please check the referenced links for the further description and examples. 1 Procedures for Socket Implementation 1. Create the server application (e.g. a simple shellscript)

More information

工程硕士信息通信网实验讲义.doc

工程硕士信息通信网实验讲义.doc 1 Linux 1.1 Linux 1.1.1 Linux 1.1.2 Linux Linux --help arp help manual manual TCP/IP ARPIP RFC1812 2.2.3 IPV4 IPv6 RFC ftp 1.1.3 1 ARP ip addr show up eth0 IP ip neigh show ARP VLAN VLAN IP Ping ICMP echo

More information

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP TCP/IP : TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP 1. ASCII EBCDIC Extended Binary-Coded Decimal Interchange Code 2. / (1) (2) Single System Image SSI) (3) I/O (4) 3.OSI OSI Open System Interconnection

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

经华名家讲堂

经华名家讲堂 5.1 5.1.1 5.1.2 5.2 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.3 5.3.1 5.3.2 5.3.3 / 5.3.4 / 5.3.5 / 5.4 Internet 5.4.1 Internet 5.4.2 Intranet 1. 2. 1 31 5 5.1 5.1.1 Internet 1 Host 20 60 IBM 2000 2 20 60 20 60

More information

9 Internet 10 Internet

9 Internet 10 Internet 1 2 3 4 5 6 Internet 7 8 9 Internet 10 Internet 11 12 1 1.1 1.2 1.3 1.4 1.5 1.6 1.1 1.1.1 20 50 20 60 ARPANET ARPANET Internet 20 70 ISO International Organization for Standardization TCP/IP 20 90 Internet

More information

VoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub

VoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub VoIP... 2... 2 Abstract... 2... 3... 3 RTP...3 Socket...4...6...7 IP...9 Config Two Voice-hub... 10 1 12 VoIP VoIP voice-hub voice-hub Abstract At the beginning of this paper, we introducted the essential

More information

工程师培训

工程师培训 .1 TCP/IP TCP/IP 1 .2.2.1 Host 1960 S 1970 S Host Low Speed Lines 1970 S 1980 S pc Server Local Interneting 1980 S 1990 S Branch. pc Branch. WAN Branch. pc pc IBM SNA IBM X.25 2 .2.2 OSI OSI Application

More information

Microsoft PowerPoint - 数据通信-ch1.ppt

Microsoft PowerPoint - 数据通信-ch1.ppt 主 要 内 容 与 基 本 要 求 主 要 内 容 数 据 通 信 与 计 算 机 网 络 计 算 机 网 络 的 发 展 过 程 分 类 以 及 主 要 性 能 指 标 ; 分 组 交 换 的 基 本 原 理 及 其 与 电 路 交 换 报 文 交 换 的 联 系 与 区 别 ; 计 算 机 网 络 的 协 议 与 体 系 结 构 第 1 章 概 述 基 本 要 求 掌 握 分 组 交 换 电 路

More information

Microsoft PowerPoint - Socket programming.ppt [相容模式]

Microsoft PowerPoint - Socket programming.ppt [相容模式] Basic Concept of Socket Socket programming 位於傳輸層和應用層之間 socket 是一種可做雙向資料傳輸的通道 讓應用層可以傳送資料給 socket, 或是從 socket 接收資料 Jimmy 2011/3/29 Concept of Socket Relation between Socket and Application Socket 的概念和檔案代碼觀念相似,

More information

ebook12-1

ebook12-1 API N e t B I O S Wi n s o c k A P I Wi n s o c k 1 N e t B I O S Wi n s o c k A P I N e t B I O S O S / 2 D O S 2 3 4 Wi n d o w s Wi n d o w s 1 NetBIOS Network Basic Input/Output System, NetBIOS A P

More information

財金資訊-80期.indd

財金資訊-80期.indd IPv6 / LINE YouTube TCP/IP TCP (Transmission Control Protocol) IP (Internet Protocol) (node) (address) IPv4 168.95.1.1 IPv4 1981 RFC 791 --IP IPv4 32 2 32 42 IP (Internet Service Provider ISP) IP IP IPv4

More information

IP505SM_manual_cn.doc

IP505SM_manual_cn.doc IP505SM 1 Introduction 1...4...4...4...5 LAN...5...5...6...6...7 LED...7...7 2...9...9...9 3...11...11...12...12...12...14...18 LAN...19 DHCP...20...21 4 PC...22...22 Windows...22 TCP/IP -...22 TCP/IP

More information

第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特 网 的 标 准 化 工 作 1.2.4 计 算 机 网 络 在

第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特 网 的 标 准 化 工 作 1.2.4 计 算 机 网 络 在 计 算 机 网 络 ( 第 4 版 ) 课 件 第 1 章 计 算 机 网 络 概 述 郭 庆 北 Ise_guoqb@ujn.edu.cn 2009-02-25 第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特

More information

投影片 1

投影片 1 資料庫管理程式 ( 補充教材 -Part2) 使用 ADO.NET 連結資料庫 ( 自行撰寫程式碼 以實現新增 刪除 修改等功能 ) Private Sub InsertButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InsertButton.Click ' 宣告相關的 Connection

More information

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC 8 TCP/IP TCP/IP TCP OSI 8.1 OSI 4 end to end A B FTP OSI Connection Management handshake Flow Control Error Detection IP Response to User s Request TCP/IP TCP 181 UDP 8.2 TCP/IP OSI OSI 3 OSI 3 8.1 TCP/IP

More information

Chap6.ppt

Chap6.ppt Computer Networks v4 cs.sjtu 12/21/12 6 Internet ftp://ftp.cs.sjtu.edu.cn/ybzhang 61 / 110 Computer Networks v4 cs.sjtu 12/21/12 ftp://ftp.cs.sjtu.edu.cn/ybzhang 62 / 110 Computer Networks v4 cs.sjtu 12/21/12

More information

AL-M200 Series

AL-M200 Series NPD4754-00 TC ( ) Windows 7 1. [Start ( )] [Control Panel ()] [Network and Internet ( )] 2. [Network and Sharing Center ( )] 3. [Change adapter settings ( )] 4. 3 Windows XP 1. [Start ( )] [Control Panel

More information

untitled

untitled Lwip Swedish Institute of Computer Science February 20, 2001 Adam Dunkels adam@sics.se (QQ: 10205001) (QQ: 329147) (QQ:3232253) (QQ:3232253) QQ ARM TCPIP LCD10988210 LWIP TCP/IP LWIP LWIP lwip API lwip

More information

/ / (FC 3)...

/ / (FC 3)... Modbus/TCP 1.0 1999 3 29 Andy Swales Schneider aswales@modicon.com ... 2 1.... 3 2.... 3 2.1.. 3 2.2..4 2.3..4 2.4... 5 3.... 5 3.1 0... 5 3.2 1... 5 3.3 2... 6 3.4 / /... 7 4.... 7 5.... 8 5.1 0... 9

More information

<4D6963726F736F667420506F776572506F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA4544350A1A24950D0ADD2E9BACD4950B5D8D6B72E707074>

<4D6963726F736F667420506F776572506F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA4544350A1A24950D0ADD2E9BACD4950B5D8D6B72E707074> 项 目 一 : 初 识 计 算 机 网 络 任 务 三 熟 悉 TCP/IP 协 议 和 IP 地 址 一. 学 习 要 求 : 学 习 要 求 及 难 点 1. 了 解 IP 协 议 TCP 协 议 和 UDP 协 议 2. 熟 悉 IP 地 址 的 划 分 和 分 类 3. 了 解 IPV6 的 地 址 结 构 二. 难 点 : 1. IP 地 址 三. 学 时 : 1. 理 论 教 学 :6

More information

ebook67-1

ebook67-1 1 1.1 T C P / I P T C P / I P 60 9 ( I n t e r n e t ) WA N 100 T C P / I P T C P / I P [ Lynch 1993] 1.2 Telnet FTP e-mail T C P / I P TCP UDP T C P / I P 1-1 1) 1-1 TCP/IP 2) T C P / I P I I C M P I

More information

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2 (2005-01-26) (2005-01-26) (2005-02-27) PIC_SERVER (9) VB TCP/UDP Visual Basic Microsoft Winsock Control (MSWINSCK.OCX) UDP TCP Client Server Visual Basic UDP/TCP PIC_SERVER UDP/TCP 1. Microsoft Winsock

More information

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD 10 SCJD 簡介 Java 10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD 10 SCJD 10-3 Java Java SCJD 7 Swing RMI 10.1.1 The Assignment The Essay 9 10 10-4 SCJP SCJD 90 10.1.2 SCJP Java 90 120 Swing 10

More information

Linux網路傳輸設定

Linux網路傳輸設定 Linux 網路傳輸設定 南台科技大學電子系 指導老師 : 侯安桑 班級 : 電子碩研一甲 學號 :M9830205 姓名 : 張嘉巖 Android 網路傳輸設定已經完成後, 接下來要開始設定 linux 網路傳輸, 目標是要將 linux 當作 server 端來設計, 使用的程式語言為 C 語言, 此作法會比 android 來的簡單許多, 只要顧慮程式流程和邏輯觀念是否正確即可, 下面會介紹

More information

Simulator By SunLingxi 2003

Simulator By SunLingxi 2003 Simulator By SunLingxi sunlingxi@sina.com 2003 windows 2000 Tornado ping ping 1. Tornado Full Simulator...3 2....3 3. ping...6 4. Tornado Simulator BSP...6 5. VxWorks simpc...7 6. simulator...7 7. simulator

More information

ch09.PDF

ch09.PDF 9-1 / (TCP/IP) TCP/IP TCP/IP ( ) ICMP ARP RARP 9.1 TCP/IP 9.1.1 TCP/IP OSI TCP/IP (DARPA) DARPA TCP/IP UNIX Berkeley Software DistributionTCP/IP TCP/IP TCP/IP TCP/IP TCP/IP TCP/IP OSI - TCP/IP ( ) ( )

More information

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南 Symantec Sygate Enterprise Protection 防 护 代 理 安 装 使 用 指 南 5.1 版 版 权 信 息 Copyright 2005 Symantec Corporation. 2005 年 Symantec Corporation 版 权 所 有 All rights reserved. 保 留 所 有 权 利 Symantec Symantec 徽 标 Sygate

More information

C6_ppt.PDF

C6_ppt.PDF C01-202 1 2 - (Masquerade) (Replay) (Message Modification) (Denial of Service) - ( ) (Eavesdropping) (Traffic Analysis) 8 1 2 7 3 6 5 4 3 - TCP SYN (SYN flood) Smurf Ping of Death LAND Attack Teardrop

More information

ebook140-9

ebook140-9 9 VPN VPN Novell BorderManager Windows NT PPTP V P N L A V P N V N P I n t e r n e t V P N 9.1 V P N Windows 98 Windows PPTP VPN Novell BorderManager T M I P s e c Wi n d o w s I n t e r n e t I S P I

More information

第3章 计算机网络体系结构

第3章  计算机网络体系结构 第 3 章 计 算 机 网 络 体 系 结 构 本 章 内 容 计 算 机 的 网 络 体 系 结 构 网 络 参 考 模 型 五 层 网 络 参 考 模 型 1 3.1 计 算 机 网 络 体 系 结 构 发 展 历 程 分 层 原 理 基 本 概 念 2 发 展 历 程 网 络 体 系 结 构 提 出 的 背 景 计 算 机 网 络 的 复 杂 性 异 质 性 不 同 的 通 信 介 质 有 线

More information

02 2 成立 Facebook 粉絲專頁 Facebook Facebook Facebook 1, Facebook Facebook 1 Facebook 2-21

02 2 成立 Facebook 粉絲專頁 Facebook Facebook Facebook 1, Facebook Facebook 1 Facebook 2-21 賺更多 24 24 2-10 我就是沒錢! 所以我只能利用免費的資源來獲取網路流量, 怎麼做比較好? 1 透過 Facebook 貼文在自己的個人頁面, 讓好友看見 Facebook Facebook 2-20 02 2 成立 Facebook 粉絲專頁 Facebook Facebook Facebook 1,000 100 Facebook Facebook 1 Facebook 2-21 賺更多

More information

前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56

前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56 前言 UDP 基础通信实例广播和多播思考练习.... 网络程序设计 (UDP).. 孙永科 西南林业大学 2010 年 8 月 21 日 1 / 56 前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56 前言 UDP

More information

( )... 5 ( ) ( )

( )... 5 ( ) ( ) 2016 大學校院招收大陸地區學生聯合招生委員會 71005 臺南市永康區南臺街 1 號 E-mail:rusen@stust.edu.tw WEB:http://rusen.stust.edu.tw TEL:+886-6-2435163 FAX:+886-6-2435165 2 0 1 6 0 1 1 9 2016... 2... 3... 5 ( )... 5 ( )... 5 1... 6 2...

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

The golden pins of the PCI card can be oxidized after months or years

The golden pins of the PCI card can be oxidized after months or years Q. 如何在 LabWindows/CVI 編譯 DAQ Card 程式? A: 請參考至下列步驟 : 步驟 1: 安裝驅動程式 1. 安裝 UniDAQ 驅動程式 UniDAQ 驅動程式下載位置 : CD:\NAPDOS\PCI\UniDAQ\DLL\Driver\ ftp://ftp.icpdas.com/pub/cd/iocard/pci/napdos/pci/unidaq/dll/driver/

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

网络程序设计(socketAPI)

网络程序设计(socketAPI) 前言通信模型重要函数 网络程序设计 (socketapi) 孙永科 西南林业大学 2010 年 9 月 6 日 1 / 40 上节回顾 前言通信模型重要函数上节回顾本章重点 阻塞和非阻塞 socket 通信模型大字节顺序小字节顺序网络字节顺序 2 / 40 本章重点 前言通信模型重要函数上节回顾本章重点 1 通信模型基本概念 Socket 通信 Socket 地址 Socket 函数 2 重要函数获取主机信息

More information

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆 Autodesk Product Design Suite Standard 20122 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆的產品設計計 Autodesk Product Design Suite Standard 版本中中包括以下軟體體產品

More information

计算机网络

计算机网络 gongwhboy@tom.com Internet 3 James F.Kurose Keith W.Ross 4 Andrew S.Tanenbaum 3 Larry L.Peterson, Bruce S.Davie 3 1. ISO OSI/RM( ) TCP/IP ( TELNET, FTP, SMTP ) (TCP UDP) IP 2. Internet : Internet 5 (1)

More information

Ps22Pdf

Ps22Pdf 26 2 2009 2 Application Research of Computers Vol. 26 No. 2 Feb. 2009 Linux IPv6 * OLSR ( 610054) IPv6 Ad hoc OLSR Linux Linux OLSR OLSR IPv6 OLSR ; OLSR ; Linux ; ; IPv6 TP393 A 1001-3695( 2009) 02-0655-

More information

ebook140-8

ebook140-8 8 Microsoft VPN Windows NT 4 V P N Windows 98 Client 7 Vintage Air V P N 7 Wi n d o w s NT V P N 7 VPN ( ) 7 Novell NetWare VPN 8.1 PPTP NT4 VPN Q 154091 M i c r o s o f t Windows NT RAS [ ] Windows NT4

More information

ebook67-9

ebook67-9 9 IP 9.1 I P 9-1 I P 9-1 d a e m o n U n i x d a e m o n d a e m o n [Perlman 1992] 10 R I P Routing Information Protocol I P 9-1 I P 30 I C M P 9. 5 r o u t e n e t s t a t route netstat UDP TCP ICMP

More information

自由軟體教學平台

自由軟體教學平台 NCHC Opensource task force DRBL steven@nchc.gov.tw, c00hkl00@nchc.gov.tw National Center for High-Performance Computing http://www.nchc.gov.tw Jan, 2003 1 2003/1/28 ( ) 09:00-10:30 10:40-12:00 Linux 13:00-14:30

More information

C3_ppt.PDF

C3_ppt.PDF C03-101 1 , 2 (Packet-filtering Firewall) (stateful Inspection Firewall) (Proxy) (Circuit Level gateway) (application-level gateway) (Hybrid Firewall) 2 IP TCP 10.0.0.x TCP Any High Any 80 80 10.0.0.x

More information

epub

epub 3 Cisco 3.1 S e t u p C i s c o C i s c o Cisco IOS C i s c o 3.2 Te l n e t T F T P 3-1 3-1 configure terminal configure memory Configure network t e l n e t < C t r l - Z > conf t N V R A M T F T P I

More information

OSI OSI 15% 20% OSI OSI ISO International Standard Organization 1984 OSI Open-data System Interface Reference Model OSI OSI OSI OSI ISO Prototype Prot

OSI OSI 15% 20% OSI OSI ISO International Standard Organization 1984 OSI Open-data System Interface Reference Model OSI OSI OSI OSI ISO Prototype Prot OSI OSI OSI 15% 20% OSI OSI ISO International Standard Organization 1984 OSI Open-data System Interface Reference Model OSI OSI OSI OSI ISO Prototype Protocol OSI OSI OSI OSI OSI O S I 2-1 Application

More information

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1 0 0 = 1 0 = 0 1 = 0 1 1 = 1 1 = 0 0 = 1 : = {0, 1} : 3 (,, ) = + (,, ) = + + (, ) = + (,,, ) = ( + )( + ) + ( + )( + ) + = + = = + + = + = ( + ) + = + ( + ) () = () ( + ) = + + = ( + )( + ) + = = + 0

More information

Microsoft Word - DIR-615_B2_Manual_1.00_T_.doc

Microsoft Word - DIR-615_B2_Manual_1.00_T_.doc D-Link DIR-615 Wireless N Broadband Router DIR-615...4 DIR-615...6...7 DIR-615...10 IP...10 DIR-615...15 DIR-615...24 DIR-615...29 D-Link DWA-645 DIR-615...30 Windows XP SP2...32 Windows Vista...35 (1)

More information

<4D6963726F736F667420576F7264202D20383439342D352DBED6D3F2CDF8D7E9BDA8D3EBB9DCC0EDCFEEC4BFBDCCB3CCD5FDCEC42E646F63>

<4D6963726F736F667420576F7264202D20383439342D352DBED6D3F2CDF8D7E9BDA8D3EBB9DCC0EDCFEEC4BFBDCCB3CCD5FDCEC42E646F63> 第 4 单 元 搭 建 自 己 的 Web 站 点 本 单 元 通 过 学 习 架 构 Web 服 务 器, 实 现 Web 服 务, 管 理 Web 站 点, 了 解 Web 站 点 服 务 器 的 架 构 个 人 空 间 和 虚 拟 主 机 的 概 念, 掌 握 IIS 组 件 的 安 装 Web 站 点 的 创 建 管 理 站 点 属 性 选 项 卡 的 配 置 管 理 等 知 识,Web 网

More information

ME3208E2-1.book

ME3208E2-1.book DocuPrint 205/255/305 操 作 說 明 書 Adobe Adobe logo PostScript PostScript 3 及 PostScript logo 是 Adobe Systems Incorporated 的 商 標 Microsoft Windows Windows NT Windows Server 是 美 國 Microsoft Corporation 於 美

More information

IP Access Lists IP Access Lists IP Access Lists

IP Access Lists IP Access Lists IP Access Lists Chapter 10 Access Lists IP Access Lists IP Access Lists IP Access Lists Security) IP Access Lists Access Lists (Network router For example, RouterA can use an access list to deny access from Network 4

More information

第 7 章 下 一 代 网 际 协 议 IPv6 141 足 的 措 施 只 能 是 权 宜 之 计 (3) 路 由 表 膨 胀 早 期 IPv4 的 地 址 结 构 也 造 成 了 路 由 表 的 容 量 过 大 IPv4 地 址 早 期 为 网 络 号 + 主 机 号 结 构, 后 来 引 入

第 7 章 下 一 代 网 际 协 议 IPv6 141 足 的 措 施 只 能 是 权 宜 之 计 (3) 路 由 表 膨 胀 早 期 IPv4 的 地 址 结 构 也 造 成 了 路 由 表 的 容 量 过 大 IPv4 地 址 早 期 为 网 络 号 + 主 机 号 结 构, 后 来 引 入 第 7 章 下 一 代 网 际 协 议 IPv6 本 章 是 有 关 下 一 代 网 际 协 议 IPv6 的 描 述, 重 点 介 绍 IPv6 的 产 生 原 因 IPv6 的 地 址 与 IPv6 首 部 格 式 等 通 过 本 章 的 学 习, 读 者 应 重 点 掌 握 和 理 解 以 下 内 容 : IPv4 向 IPv6 发 展 的 必 然 性 IPv6 的 新 特 性 IPv6 地

More information

(UTM???U_935_938_955_958_959 V2.1.9.1)

(UTM???U_935_938_955_958_959 V2.1.9.1) 192.16 www.sharetech.com.tw UTM 多 功 能 防 火 牆 管 理 者 手 冊 V 2.1.9.1 目 錄 第 一 章 安 裝 與 訊 息... 7 1-1 建 議 的 安 裝 設 定 圖... 8 1-2 軟 體 安 裝 設 定... 9 1-3 首 頁 訊 息... 14 1-4 型 號 與 功 能 對 照 表... 17 第 二 章 系 統 設 定... 19 2-1

More information

Microsoft Word - 100118002.htm

Microsoft Word - 100118002.htm 100 年 度 11800 電 腦 軟 體 應 用 乙 級 技 術 士 技 能 檢 定 學 科 測 試 試 題 本 試 卷 有 選 擇 題 80 題, 每 題 1.25 分, 皆 為 單 選 選 擇 題, 測 試 時 間 為 100 分 鐘, 請 在 答 案 卡 上 作 答, 答 錯 不 倒 扣 ; 未 作 答 者, 不 予 計 分 准 考 證 號 碼 : 姓 名 : 選 擇 題 : 1. (3)

More information

09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content

09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content 當智慧財產 侵犯人權? 智慧財產與人權 Kickstarter The Matrix The Matrix Avatar Eywa 12 2013 4 484 09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content

More information

ebook67-10

ebook67-10 10 10.1 r o u t e I C M P R I P (Routing Infromation Protocol) T C P / I P O S P F B G P I n t e r n e t B 10.2 routing daemon 9-1 9. 2 I P routing mechanism r o u t e routing policy I n t e r n e t I

More information

Chapter 5- 运输层 (5)-2017

Chapter 5- 运输层 (5)-2017 计算机网络 运输层编程 (5) 陈旺虎 chenwh@nwnu.edu.cn Review TCP 协议格式 TCP 可靠传输 为什么需要三次握手? A 发送一次确认的原因 应对出现 已失效的连接请求报文段 的情况, 即防止已失效的连接请求报文段突然又传到了 B 例 1:A 发出连接请求, 但该请求丢失,A 重传连接请求, 到达 B, 则正常 ; 一. 认识 Socket 应用层程序 流套接字接口

More information

目 彔 1. 准 备 工 作... 1 2. 登 彔 设 置... 2 3. 功 能 说 明... 4 3.1 实 时 监 控... 4 3.1.1 基 本 控 制... 4 4.1.2 功 能 设 置... 4 3.1.3 画 质 调 节... 6 3.1.4 彔 像 与 抓 拍... 6 3.1

目 彔 1. 准 备 工 作... 1 2. 登 彔 设 置... 2 3. 功 能 说 明... 4 3.1 实 时 监 控... 4 3.1.1 基 本 控 制... 4 4.1.2 功 能 设 置... 4 3.1.3 画 质 调 节... 6 3.1.4 彔 像 与 抓 拍... 6 3.1 嵌 入 式 Web Server 用 户 手 册 V2.0 感 谢 您 选 用 本 公 司 的 产 品, 请 您 在 使 用 本 产 品 前 仔 细 阅 读 用 户 手 册, 本 用 户 手 册 将 为 您 提 供 正 确 的 使 用 说 明 版 权 声 明 : 本 用 户 手 册 版 权 归 天 津 市 亚 安 科 技 股 仹 有 限 公 司 所 有, 未 经 本 公 司 许 可, 仸 何 机 构

More information

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内 A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内 容 分 发 网 络 Alibaba Cloud Content Delivery Network 一

More information

SEC-220

SEC-220 Session CERT/CC 60000 50000 40000 52,658 30000 26,829 20000 10000 0 2,412 1995 1999 2000 2001 Q1, 2002 Source: http://www.cert.org/stats/ CERT/CC 3000 2500 2000 2,437 1500 1000 500 0 171 1,065 1995

More information

VIDEOJET connect 7000 VJC-7000-90 zh- CHS Operation Manual VIDEOJET connect 7000 zh-chs 3 目 录 1 浏 览 器 连 接 7 1.1 系 统 要 求 7 1.2 建 立 连 接 7 1.2.1 摄 像 机 中 的 密 码 保 护 7 1.3 受 保 护 的 网 络 7 2 系 统 概 述 8 2.1 实 况

More information

《信息通信网》实验指导书

《信息通信网》实验指导书 IPv6 网络基础编程 一 实验目的 学习网络套接口 (socket) 编程, 掌握 Linux 操作系统下使用 TCP 协议进行通信的 IPv6 网络应用程序基本实现框架, 加深对 IPv6 协议的理解 二 预备工作和实验要求 将纯 IPv4 网络应用程序移植到纯 IPv6 环境下并没有多大困难 ; 对于典型的 C/S 结构程序, 我们只需对客户端和服务器端源代码进行简单修改, 然后重新编译它们

More information

IP TCP/IP PC OS µclinux MPEG4 Blackfin DSP MPEG4 IP UDP Winsock I/O DirectShow Filter DirectShow MPEG4 µclinux TCP/IP IP COM, DirectShow I

IP TCP/IP PC OS µclinux MPEG4 Blackfin DSP MPEG4 IP UDP Winsock I/O DirectShow Filter DirectShow MPEG4 µclinux TCP/IP IP COM, DirectShow I 2004 5 IP TCP/IP PC OS µclinux MPEG4 Blackfin DSP MPEG4 IP UDP Winsock I/O DirectShow Filter DirectShow MPEG4 µclinux TCP/IP IP COM, DirectShow I Abstract The techniques of digital video processing, transferring

More information

Microsoft Word - PS2_linux_guide_cn.doc

Microsoft Word - PS2_linux_guide_cn.doc Linux For $ONY PlayStatioin2 Unofficall General Guide Language: Simplified Chinese First Write By Beter Hans v0.1 Mail: hansb@citiz.net Version: 0.1 本 人 是 菜 鸟 + 小 白 欢 迎 指 正 错 误 之 处, 如 果 您 有 其 他 使 用 心 得

More information

ebook

ebook 32 IP 32.1 I n t e r n e t S O C K _ R A W I P 3 1) I C M P I G M P P i n g I C M P I C M P I C M P 1 9. 7 N e t / 3 R T M _ R E D I R E C T I C M P ( 1 9. 6 ) I C M P I G M P I G M 2) I P U D P I P U

More information

男人的大腦 女人的大腦

男人的大腦 女人的大腦 46 2014 6 498 男女大乾坤 男女的戀愛行為 男人的大腦 女人的大腦 2014 6 498 47 48 2014 6 498 女人的戀愛行為 70 900 男人的戀愛行為 8 2014 6 498 49 50 2014 6 498 對於愛與性的混淆 男女所面臨的問題 和我一樣喜歡做愛除了我, 不可以看別人相信我, 沒有問題現在, 和我做愛知道如何引燃我從不傷害我 朋友關係和性 嫉妒和占有欲

More information

嵌入式Linux块设备驱动开发解析

嵌入式Linux块设备驱动开发解析 The success's road 嵌 入 式 LINUX 网 络 驱 动 开 发 Copyright 2007-2008 Farsight. All rights reserved. 要 点 Linux 网 络 设 备 驱 动 程 序 概 述 计 算 机 网 络 概 述 skbuf 数 据 结 构 介 绍 Linux 网 络 设 备 驱 动 程 序 API 介 绍 Linux 网 络 设 备 驱

More information

資料結構之C語言重點複習

資料結構之C語言重點複習 鏈結串列自編教材 ( 一 ) 本教材 ( 一 ) 目標問題 : 每次以亂數產生一 [0,1000] 之整數值, 若該值 >100, 則以同方式繼續產生下一亂數值, 若該值

More information

CU0594.pdf

CU0594.pdf 8 SOHO 1 3 003 SOHO SOHO Coder Programmer HTML CSS PHP JavaScrip 009 LECTURE 1-1 1 048 PART 2 LECTURE 1-1 1 049 SOHO Landing Page Landing 050 PART 2 LECTURE 1-1 1 SEO SEO P.093 SEO SEO SEO SEO SEO 051

More information

下表所示, 此时 protocol 参数可使用缺省值 0 ; 但如果还有多个协议供选择, 则必须使用 protocol 参数来标识 协议族 ( 仅考虑 IP 协议 传送类型 protocol 参数常量 协议类型 族 ) (/usr/include/linux/in.h) SOCK_STREAM IP

下表所示, 此时 protocol 参数可使用缺省值 0 ; 但如果还有多个协议供选择, 则必须使用 protocol 参数来标识 协议族 ( 仅考虑 IP 协议 传送类型 protocol 参数常量 协议类型 族 ) (/usr/include/linux/in.h) SOCK_STREAM IP 实验 2 参考资料 Linux/Unix:Socket 函数库 Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的 BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Linux 下的 Socket 程序设计, 除了微小的差别之外, 也适用于大多数其它 Unix 系统 Socket 的使用和文件操作比较类似 如同文件的读

More information

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO Car DVD New GUI IR Flow User Manual V0.1 Jan 25, 2008 19, Innovation First Road Science Park Hsin-Chu Taiwan 300 R.O.C. Tel: 886-3-578-6005 Fax: 886-3-578-4418 Web: www.sunplus.com Important Notice SUNPLUS

More information

ebook140-11

ebook140-11 11 VPN Windows NT4 B o r d e r M a n a g e r VPN VPN V P N V P N V P V P N V P N TCP/IP 11.1 V P N V P N / ( ) 11.1.1 11 V P N 285 2 3 1. L A N LAN V P N 10MB 100MB L A N VPN V P N V P N Microsoft PPTP

More information

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089 Photoshop CC Camera Raw Photoshop Camera Raw Step 1 3 1 2 3 SCOTT KELBY Step 2 B Camera Raw 088 Chapter 3 Camera Raw Chapter 3 Camera Raw Step 3-4 -100 negative clarity +25 ] P / -75-50 Step 4 0 ( 下一頁

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

ansoft_setup21.doc

ansoft_setup21.doc Cadence Cadence Cadence 1000 (1) (2) CIC (3).. CIC Cadence (a) CIC license license server license CIC license CIC license (b) 2000 Cadence license 92 1 1 license server CIC 92 1 1 Cadence license licenser

More information

IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG

IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG --------------------------------------------TABLE OF CONTENTS------------------------------------------

More information

目 錄 頁 次 政 風 法 令 宣 導 一 行 政 中 立 實 務 探 討 二 收 到 支 付 命 令 不 可 置 之 不 理 3 9 公 務 機 密 維 護 宣 導 一 淺 談 駭 客 攻 擊 14 二 何 不 自 行 設 計 入 侵 防 禦 系 統? 17 安 全 維 護 宣 導 認 識 爆 竹

目 錄 頁 次 政 風 法 令 宣 導 一 行 政 中 立 實 務 探 討 二 收 到 支 付 命 令 不 可 置 之 不 理 3 9 公 務 機 密 維 護 宣 導 一 淺 談 駭 客 攻 擊 14 二 何 不 自 行 設 計 入 侵 防 禦 系 統? 17 安 全 維 護 宣 導 認 識 爆 竹 103 年 6 月 地 政 局 政 風 室 編 撰 1 目 錄 頁 次 政 風 法 令 宣 導 一 行 政 中 立 實 務 探 討 二 收 到 支 付 命 令 不 可 置 之 不 理 3 9 公 務 機 密 維 護 宣 導 一 淺 談 駭 客 攻 擊 14 二 何 不 自 行 設 計 入 侵 防 禦 系 統? 17 安 全 維 護 宣 導 認 識 爆 竹 煙 火 高 雄 市 爆 竹 煙 火 施 放

More information

理性真的普遍嗎 注意力的爭奪戰 科學發展 2012 年 12 月,480 期 13

理性真的普遍嗎 注意力的爭奪戰 科學發展 2012 年 12 月,480 期 13 12 科學發展 2012 年 12 月,480 期 你可能不知道的媒體影響 劉正山若用 選戰 的角度來看選舉和參與選舉, 你大腦裡情感的作用一定大過理性的作用, 便會很習慣地拿各種媒體或別人的觀點來使自己的選擇合理化 2012 理性真的普遍嗎 注意力的爭奪戰 科學發展 2012 年 12 月,480 期 13 14 科學發展 2012 年 12 月,480 期 agendasetting 報紙和網路新聞的頭版空間有限,

More information

Data Server_new_.doc

Data Server_new_.doc 0i B/C Data Server Windows 2000 Window XP Windows XP FTP FANUC Data Server FTP liwei@beijing-fanuc 1 06-10-8 Content 1. /...3 1.1...3 1.2...3 1.3 CNC...3 2....5 2.1 STORAGE...5 2.2 FTP...6 2.3 BUFFER...7

More information

投影片 1

投影片 1 數位相片基礎編修 Photoshop,,,, 2 ,, 3 / 4 3-1,...,, Photoshop,,, 5 5 6 ,,..., 5,,, 7 3-2,...,,, 8 , Photoshop,,, / 9 10 ,,,,,, 03-02.jpg,,,,, Photoshop " ", Photoshop 11 12 / /, Photoshop, 13 14 ,,, " " " " 6

More information

中文朗科AirTrackTM T600 迷你无线路由器用户手册.doc

中文朗科AirTrackTM T600 迷你无线路由器用户手册.doc AirTrack T600 http://www.netac.com.cn Netac Netac AirTrack OnlyDisk Netac Netac Netac http://www.netac.com.cn Netac 800-830-3662 FCC 15 B 1 2 3 4 / FCC 20cm 1 2 3 / / ...1 1.1...1 1.2...1 1.3...1 1.4...3...4

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

使用手冊

使用手冊 使用手冊 版權所有 2013 年 Microtek International, Inc. 保留所有權利 商標 Microtek MII MiiNDT ScanWizard Microtek International, Inc. Windows Microsoft Corporation 重要須知 Microtek Microtek Windows Microsoft Windows I49-004528

More information

Web

Web Email: tian@dr.com http://www.digiark.com/tian Web 1. 2. 3. 4. 5. 6. Internet Internet (Hacker) Internet web IP 1 Internet UNIX Windows VLAN Internet IP 2 Internet FTP TELNET PING IP 8 telnet FTP RLOGIN

More information

第 11 章 互聯網技術 11.1 互聯 網 和 萬 維 網 的 發 展 歷 史 A. 互聯網的發展 互聯網是由 ARPANET 開 始發展的 1969 年 美國國防部高級研究計劃署 (ARPA) 把部分軍事研究所和大 的電腦連接起來 建造了㆒個實驗性的電腦網絡 稱為 ARPANET 並 列 的功能

第 11 章 互聯網技術 11.1 互聯 網 和 萬 維 網 的 發 展 歷 史 A. 互聯網的發展 互聯網是由 ARPANET 開 始發展的 1969 年 美國國防部高級研究計劃署 (ARPA) 把部分軍事研究所和大 的電腦連接起來 建造了㆒個實驗性的電腦網絡 稱為 ARPANET 並 列 的功能 互 聯 網 技 術 在 完 成 這 章 後, 你 將 能 夠 描 述 互 聯 網 的 發 展 歷 史 描 述 萬 維 網 的 發 展 歷 史 了 解 連 接 互 聯 網 的 基 本 概 念 能 夠 連 接 到 互 聯 網 知 道 互 聯 網 如 何 運 作 互 聯 網 是 全 球 網 絡 的 集 合 互 聯 網 (Internet) 是 ㆒ 個 集 合 全 球 許 多 網 絡 ㆒ 起 的 大 型 網

More information

2016 勒索軟體白皮書

2016 勒索軟體白皮書 Botnet Botnet 1 1 2 2 5 5 6 9 10 11 11 11 12 12 12 12 12 12 13 14 2016 1989 AIDS AIDS C 189 2005 2006 TROJ_CRYPZIP.A 2011 TROJ_RANSOM.QOWA 12 2012 REVETON 2013 Cryptolocker Cryptolocker AES RSA Cryptolocker

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

戒菸實務個案自助手冊105年Ver.2

戒菸實務個案自助手冊105年Ver.2 本計劃經費來自 品健康福利捐支應 衛生福利部國民健康署 我 名字 為了 以下理由 1. 2. 3. 4. 5. 決定從 年 月 日起 簽署人 (簽章) 見證人 (簽章) 年 月 日 a 準備戒 V 環境的準備 排除讓自己想吸 自己戒 的環境 V 心理的準備 瞭解自己的吸 的環境 建立能提醒 行為 強化戒 決心 V 身體的準備 評估身體的尼古丁依賴度 必要時找尋 藥物降低戒 戒 的難度

More information

( CIP) /,. - :, 2004. 9 ISBN 7-81094-144-5... - -. TP312 CIP ( 2004 ) 057057 21 : ( 2 4 610054 ) : : : : 787960 1 /16 : 21 : 347 : 2004 9 : 2004 9 : I

( CIP) /,. - :, 2004. 9 ISBN 7-81094-144-5... - -. TP312 CIP ( 2004 ) 057057 21 : ( 2 4 610054 ) : : : : 787960 1 /16 : 21 : 347 : 2004 9 : 2004 9 : I 1 ( CIP) /,. - :, 2004. 9 ISBN 7-81094-144-5... - -. TP312 CIP ( 2004 ) 057057 21 : ( 2 4 610054 ) : : : : 787960 1 /16 : 21 : 347 : 2004 9 : 2004 9 : ISBN 7 81094-142 9 /TP83 : 1-5000 : 29. 80 ,,,,,,,,,,,,,,,,,,,,,,,,

More information

穨CAS1042中文手冊.doc

穨CAS1042中文手冊.doc CAS1042 4 port 10/100M Switch Internet BroadBand Router ...1...2...3 5...3 1...3 2 ADSL MODEM CABLE MODEM...4...5 4 TCP/IP...6 Windows 95 / 98 / ME/XP...6 WINDOWS 2000...8 WINDOWS NT 4.0...8...9 ADSL (ADSL

More information

QL1880new2.PDF

QL1880new2.PDF ADSL Modem 1 MODEM 56K MODEM 128K ISDN INTERNET ADSL Modem VOD ADSL ADSL 2 1.1 ADSL 1.2 1.3 KM300A 2.1 2.2 2.3 2.4 2.5 KM300A 2.6 web 2.7 1.1ADSL 1.2 1.3 2.1 ADSL 2.2 ADSL 3 ADSL KM300A ADSL KM300A DIY

More information

计算机网络概论

计算机网络概论 1 repeater bridge router gateway V.S OSI Repeater(Hub) 1 Repeater 2 3 ( Hub 4 Bridge 1 Bridge 2 N N DL1 DL1 DL2 DL2 Ph1 Ph1 Ph2 Ph2 1 2 Bridge 3 MAC Ethernet FDDI MAC MAC Bridge 4 5 6 7 50873EA6, 00123456

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

編 輯 室 手 札 Editor Navigation 刑 事 資 訊 科 技 再 造 整 合 分 析 犯 罪 情 資 文 / 編 輯 室 刑 事 資 訊 科 技 的 發 展, 從 最 初 定 位 於 犯 罪 資 料 電 子 數 位 化, 再 隨 著 犯 罪 手 法 科 技 化 的 趨 勢, 刑 事 資 訊 科 技 在 犯 罪 偵 查 工 作 上 的 角 色 也 愈 顯 重 要, 刑 事 資 訊 業

More information

BYOD Http Redirect convergence Client (1) 2008R2 NLB( ) (2) NLB Unicast mode switch flooding (arp ) NLB DNS Redirect 1. Round-Robin DNS DNS IP/DNS Cli

BYOD Http Redirect convergence Client (1) 2008R2 NLB( ) (2) NLB Unicast mode switch flooding (arp ) NLB DNS Redirect 1. Round-Robin DNS DNS IP/DNS Cli BYOD 204 2015 GoogleHicloud (Load Balance) Server Load Balance Link Load Balance Server Redirect 1. URL Redirect redirector URL redirect Real Server Client HTTP Real Server Web Client 2 (1) URL Redirect

More information

SiteView技术白皮书

SiteView技术白皮书 SiteView ECC V6.2 技 术 白 皮 书 游 龙 网 络 科 技 ( 中 国 ) 有 限 公 司 DragonFlow Networks(China),Inc. 目 录 第 一 章 产 品 概 述... 3 第 二 章 系 统 结 构... 6 一 系 统 架 构... 7 1 用 户 管 理 模 块... 7 2 Web Server... 8 3 存 储 加 密 模 块... 8

More information