TCP服務器

1、socket編程編程

    1.socket 服務器

   在TCP/IP協議中,「IP地址+TCP或UDP端口號」惟一標識網絡通信中的一個進程,「IP地址+端口號」就稱爲socket。 網絡

   在TCP協議中,創建鏈接的兩個進程各自有一個socket來標識,那麼這兩個socket組成的socket pair就惟一標識一個鏈接。socket自己有「插座」的意思,所以用來描述網絡鏈接的一 對一關係。socket

     2.網絡字節序ide

    發送主機一般將發送緩衝區中的數據按內存地址從低到高的順序發出,接收主機把從網絡上接到的字節依次保存在接收緩衝區中,也是按內存地址從低到高的順序保存,所以,網絡數據流的地址應這樣規定:先發出的數據是低地址,後發出的數據是高地址。 函數

    TCP/IP協議規定,網絡數據流應採用大端字節序,即低地址高字節。spa

    爲使網絡程序具備可移植性,使一樣的C代碼在大端和小端計算機上編譯後都能正常運行,能夠調用如下庫函數作網絡字節序和主機字節序的轉換3d

    wKiom1eaD53D_KZNAAArfuynTQA708.jpg-wh_50

    h表示host,n表示network,l表示32位長整數,s表示16位短整數。例 如htonl表示將32位的長整數從主機字節序轉換爲網絡字節序,例如將IP地址轉換後準備發送。若是主機是小端字節序,這些函數將參數作相應的大小端轉換而後返回,若是主機是大端字節序,這些 函數不作轉換,將參數原封不動地返回。 orm

    3.socket地址的數據類型及相關函數blog

    本文基於IPv4的socket網絡編程,sockaddr_in中的成員struct in_addr sin_addr表示32位的IP地址。可是咱們一般用點分十進制的字符串表示IP 地址,如下函數能夠在字符串表示和in_addr表示之間轉換。  

    字符串轉in_addr的函數:

    

wKioL1eaEf2gmgfsAAAv3GAdnXE319.jpg-wh_50

    in_addr轉字符串的函數: 

wKiom1eaEf3wNgnqAAAfD4e6YmY996.jpg-wh_50 

    4.TCP協議通訊流程

   服務器調用socket()、bind()、listen() 完成初始化後,調用accept()阻塞等待,處於監聽端口的狀態,客戶端調用socket()初始化後,調用connect()發出SYN段並阻塞等待服務器應答,服務器應答一個SYN-ACK段,客戶端收到後從connect()返回,同時應答一個ACK段,服務器收到後從accept()返回。

    數據傳輸的過程: 創建鏈接後,TCP協議提供全雙工的通訊服務,可是通常的客戶端/服務器程序的流程是由客戶端主動發起請求,服務器被動處理請求,一問一答的方式。所以,服務器從 accept()返回後馬上調用read(),讀socket就像讀管道同樣,若是沒有數據到達就阻塞等待,這時客戶端調用write()發送請求給服務器,服務器收到後從read()返回,對客戶端的請求進行處理,在此期間客戶端調用read()阻塞等待服務器的應答,服務器調用write()將處理結果發回給客戶端,再 次調用read()阻塞 等待下一條請求,客戶端收到後從read()返回,發送下一條請求,如此循環下去。

    若是客戶端沒有更多的請求了,就調close() 關閉鏈接,就像寫端關閉的管道同樣,服務器 的read()返回0,這樣服務器就知道客戶端關閉了鏈接,也調用close()關閉鏈接。注意,任何一方調用close()後,鏈接的兩個傳輸方向都關閉,不能再發送數據了。若是一方調用shutdown() 則鏈接處於半關閉狀態,仍可接收對方發來的數據。   

2、代碼實現

    1.Makefile的編寫

wKiom1eaCr-SnTQuAAA5G8Y4VQQ067.jpg-wh_50

    2.服務器代碼實現

wKioL1eaCsHzLOx0AACZ0cZ9hVA114.jpg-wh_50

wKioL1eaCsLQTNMAAABac5QjV4M374.jpg-wh_50

wKiom1eaCsOgpBuDAACEW4LpJHY288.jpg-wh_50

wKioL1eaCsThCKePAACIgrV8in4555.jpg-wh_50

wKiom1eaCsTC6xxvAAA8xtSzGN0611.jpg-wh_50

wKioL1eaC***WdryAAAIB3Exe7s849.jpg-wh_50

    3.客戶端代碼實現

wKiom1eaC_nwVpkdAAB2WIesq0Q678.jpg-wh_50

wKioL1eaC_rSJAOWAACGAxFsCak613.jpg-wh_50

wKioL1eaC_uDak9jAABKkE1N2k8574.jpg-wh_50

3、結果展現

wKioL1eaExXQsiEvAAAXRsm1-Bs137.jpg-wh_50

wKiom1eaExaSu522AAA3iQGfq_s546.jpg-wh_50

相關文章
相關標籤/搜索