【轉】TCP/IP通信程序設計的豐富多樣性

剛接觸TCP/IP通信設計的人根據範例可以很快編出一個通信程序,據此一些人可能會認爲TCP/IP編程很簡單。其實不然,TCP/IP編程具有較爲豐富的內容。其編程的豐富性主要體現在通信方式和報文格式的多樣性上。

 

  一、通信方式

  主要有以下三大類:

  (一)SERVER/CLIENT方式

  1.一個Client方連接一個Server方,或稱點對點(peer to peer):
  2.多個Client方連接一個Server方,這也是通常的併發服務器方式。
  3.一個Client方連接多個Server方,這種方式很少見,主要用於一個客戶向多個服務器發送請求情況。

 

   (二)連接方式

  1.長連接

  Client方與Server方先建立通訊連接,連接建立後不斷開,然後再進行報文發送和接收。這種方式下由於通訊連接一直存在,可以用下面命令查看連接是否建立:

  netstat –f inet|grep 端口號(如5678)。

  此種方式常用於點對點通訊。

  2.短連接

  Client方與Server每進行一次報文收發交易時才進行通訊連接,交易完畢後立即斷開連接。此種方式常用於一點對多點通訊,比如多個Client連接一個Server.

 

  (三)發送接收方式

  1.異步

  報文發送和接收是分開的,相互獨立的,互不影響。這種方式又分兩種情況:

  (1)異步雙工:接收和發送在同一個程序中,有兩個不同的子進程分別負責發送和接收
  (2)異步單工:接收和發送是用兩個不同的程序來完成。

 

  2.同步

  報文發送和接收是同步進行,既報文發送後等待接收返回報文。同步方式一般需要考慮超時問題,即報文發上去後不能無限等待,需要設定超時時間,超過該時間發送方不再等待讀返回報文,直接通知超時返回。

  實際通信方式是這三類通信方式的組合。比如一般書上提供的TCP/IP範例程序大都是同步短連接的SERVER/CLIENT程序。有的組合是基本不用的,比較常用的有價值的組合是以下幾種:

  同步短連接Server/Client
  同步長連接Server/Client
  異步短連接Server/Client
  異步長連接雙工Server/Client
  異步長連接單工Server/Client

  其中異步長連接雙工是最爲複雜的一種通信方式,有時候經常會出現在不同銀行或不同城市之間的兩套系統之間的通信。比如金卡工程。由於這幾種通信方式比較固定,所以可以預先編制這幾種通信方式的模板程序。

 

 

  二.報文格式

  通信報文格式多樣性更多,相應地就必須設計對應的讀寫報文的接收和發送報文函數。

  (一)阻塞與非阻塞方式 

  1.非阻塞方式

  讀函數不停地進行讀動作,如果沒有報文接收到,等待一段時間後超時返回,這種情況一般需要指定超時時間。

  2.阻塞方式

  如果沒有報文接收到,則讀函數一直處於等待狀態,直到有報文到達。

 

  (二)循環讀寫方式

  1.一次直接讀寫報文

  在一次接收或發送報文動作中一次性不加分別地全部讀取或全部發送報文字節。

  2.不指定長度循環讀寫

  這一般發生在短連接進程中,受網絡路由等限制,一次較長的報文可能在網絡傳輸過程中被分解成了好幾個包。一次讀取可能不能全部讀完一次報文,這就需要循環讀報文,直到讀完爲止。

  3.帶長度報文頭循環讀寫

  這種情況一般是在長連接進程中,由於在長連接中沒有條件能夠判斷循環讀寫什麼時候結束,所以必須要加長度報文頭。讀函數先是讀取報文頭的長度,再根據這個長度去讀報文.實際情況中,報頭的碼制格式還經常不一樣,如果是非ASCII碼的報文頭,還必須轉換成ASCII,常見的報文頭碼制有:

  (1)n個字節的ASCII碼
  (2)n個字節的BCD碼
  (3)n個字節的網絡整型碼

 

  以上是幾種比較典型的讀寫報文方式,可以與通信方式模板一起預先提供一些典型的API讀寫函數。當然在實際問題中,可能還必須編寫與對方報文格式配套的讀寫API.

 

  在實際情況中,往往需要把我們自己的系統與別人的系統進行連接,有了以上模板與API,可以說連接任何方式的通信程序都不存在問題。

發佈了46 篇原創文章 · 獲贊 0 · 訪問量 4816
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章