socket 工作原理與電話工作原理比較

什麼是 socket

socket 是進行程序間通訊(IPC)的 BSD 方法。這意味着 socket 用來讓一個進程和其他的進程互通信息,就象我們用電話來和其他的人交流一樣。

用電話來比喻是很恰當的,我們在後面將一直用電話這個概念來描敘 socket 。

裝上你的新電話(怎樣偵聽?)

一個人要能夠收到別人打給他的電話,首先他要裝上一門電話。同樣,你必須先建立 socket 以偵聽線路。這個過程包含幾個步驟。首先,你要建立一個新的 socket,就象先裝上電話一樣。socket() 命令就完成這個工作。

因爲 sockets 有幾種類型,你要註明你要建立什麼類型的。你要做一個選擇是 socket 的地址格式。如同電話有音頻和脈衝兩種形式一樣,socket 有兩個最重要的選項是 AF_UNIXIAF_INETAF_UNIX 就象 UNIX 路徑名一樣識別 sockets。這種形式對於在同一臺機器上的 IPC 很有用。而 AF_INET 使用象 192.9.200.10 這樣被點號隔開的四個十進制數字的地址格式。除了機器地址以外,還可以利用端口號來允許每臺機器上的多個 AF_INET socket。我們這裏將着重於 AF_INET 方式,因爲他很有用並廣泛使用。

另外一個你必須提供的參數是 socket 的類型。兩個重要的類型是 SOCK_STREAMSOCK_DGRAMSOCK_STREAM 表明數據象字符流一樣通過 socket 。而 SOCK_DGRAM 則表明數據將是數據報(datagrams)的形式。我們將講解 SOCK_STREAM sockets,他很常見並易於使用。

在建立 socket 後,我們就要提供 socket 偵聽的地址了。就象你還要個電話號碼來接電話一樣。bind() 函數來處理這件事情。

SOCK_STREAM sockets 讓連接請求形成一個隊列。如果你忙於處理一個連接,別的連接請求將一直等待到該連接處理完畢。listen() 函數用來設置最大不被拒絕的請求數(一般爲5個)。一般最好不要使用 listen() 函數。

下面的代碼說明如何利用 socket()bind()listen() 函數建立連接並可以接受數據。

 

 

在建立完 socket 後,你要等待對該 socket 的調用了。accept() 函數爲此目的而來。調用 accept() 如同在電話鈴響後提起電話一樣。Accept() 返回一個新的連接到調用方的 socket 。

下面的代碼演示使用是個演示。

 

(略)

 

 

和電話不同的是,在你處理先前的連接的時候,你還可以接受調用。爲此,一般用 fork 來處理每個連接。下面的代碼演示如何使用 establish()get_connection() 來處理多個連接。

 

 

撥號 (如何調用 socket)

現在你應該知道如何建立 socket 來接受調用了。那麼如何調用呢?和電話一樣,你要先有個電話。用 socket() 函數來完成這件事情,就象建立偵聽的 socket 一樣。

在給 socket 地址後,你可以用 connect() 函數來連接偵聽的 socket 了。下面是一段代碼。

 

這個函數返回一個可以流過數據的 socket 。

談話(如何通過 sockets 交談)

好了,你在要傳輸數據的雙方建立連接了,現在該傳輸數據了。read()write() 函數來處理吧。除了在 socket 讀寫和文件讀寫中的一個區別外,和處理一般的文件一樣。區別是你一般不能得到你所要的數目的數據。所以你要一直循環到你需要的數據的到來。一個簡單的例子:將一定的數據讀到緩存。

 

 

相同的函數也可以寫數據,留給我們的讀者吧。

掛起(結束)

和你通過電話和某人交談後一樣,你要在 socket 間關閉連接。一般 close() 函數用來關閉每邊的 socket 連接。如果一邊的已經關閉,而另外一邊卻在向他寫數據,則返回一個錯誤代碼。

世界語(交流的語言很重要)

現在你可以在機器間聯絡了,可是要小心你所說的話。許多機器有自己的方言,如 ASCII 和 EBCDIC。更常見的問題是字節順序問題。除非你一直傳輸的都是文本,否則你一定要注意這個問題。幸運的是,人們找出瞭解決的辦法。

在很久以前,人們爭論哪種順序更“正確”。現在必要時有相應的函數來轉換。其中有 htons()ntohs()htonl()ntohl()。在傳輸一個整型數據前,先轉換一下。

 

i= htonl(i);
write_data(s, &i, sizeof(i));

在讀數據後,再變回來。

 

read_data(s, &i, sizeof(i));
i= ntohl(i);

如果你一直堅持這個習慣,你將比別人少出錯的機會。

未來在你的掌握了(下一步?)

就用我們剛纔討論的東西,你就可以寫自己的通訊程序了。和對待所有的新生事物一樣, 最好還是看看別人已經做了些什麼。這裏有許多關於 BSD socket 的東西可以參考。

請注意,例子中沒有錯誤檢查,這在“真實”的程序中是很重要的。你應該對此充分重視。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章