TCP服務(wù)器
調(diào)用服務(wù)器
一、socket編程
1.socket
在TCP/IP協(xié)議中,“IP地址+TCP或UDP端口號”唯一標識網(wǎng)絡(luò)通訊中的一個進程,“IP地址+端口號”就稱為socket。
在TCP協(xié)議中,建立連接的兩個進程各自有一個socket來標識,那么這兩個socket組成的socketpair就唯一標識一個連接。socket本身有“插座”的意思,因此用來描述網(wǎng)絡(luò)連接的一對一關(guān)系。
2.網(wǎng)絡(luò)字節(jié)序
發(fā)送主機通常將發(fā)送緩沖區(qū)中的數(shù)據(jù)按內(nèi)存地址從低到高的順序發(fā)出,接收主機把從網(wǎng)絡(luò)上接到的字節(jié)依次保存在接收緩沖區(qū)中,也是按內(nèi)存地址從低到高的順序保存,因此,網(wǎng)絡(luò)數(shù)據(jù)流的地址應(yīng)這樣規(guī)定:先發(fā)出的數(shù)據(jù)是低地址,后發(fā)出的數(shù)據(jù)是高地址。
TCP/IP協(xié)議規(guī)定,網(wǎng)絡(luò)數(shù)據(jù)流應(yīng)采用大端字節(jié)序,即低地址高字節(jié)。
為使網(wǎng)絡(luò)程序具有可移植性,使同樣的C代碼在大端和小端計算機上編譯后都能正常運行,可以調(diào)用以下庫函數(shù)做網(wǎng)絡(luò)字節(jié)序和主機字節(jié)序的轉(zhuǎn)換。
h表示host,n表示network,l表示32位長整數(shù),s表示16位短整數(shù)。例如htonl表示將32位的長整數(shù)從主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,例如將IP地址轉(zhuǎn)換后準備發(fā)送。如果主機是小端字節(jié)序,這些函數(shù)將參數(shù)做相應(yīng)的大小端轉(zhuǎn)換然后返回,如果主機是大端字節(jié)序,這些函數(shù)不做轉(zhuǎn)換,將參數(shù)原封不動地返回。
3.socket地址的數(shù)據(jù)類型及相關(guān)函數(shù)
本文基于IPv4的socket網(wǎng)絡(luò)編程,sockaddr_in中的成員structin_addrsin_addr表示32位的IP地址。但是我們通常用點分十進制的字符串表示IP地址,以下函數(shù)可以在字符串表示和in_addr表示之間轉(zhuǎn)換。
字符串轉(zhuǎn)in_addr的函數(shù):
in_addr轉(zhuǎn)字符串的函數(shù):
4.TCP協(xié)議通信流程
服務(wù)器調(diào)用socket、bind、listen完成初始化后,調(diào)用accept阻塞等待,處于監(jiān)聽端口的狀態(tài),客戶端調(diào)用socket初始化后,調(diào)用connect發(fā)出SYN段并阻塞等待服務(wù)器應(yīng)答,服務(wù)器應(yīng)答一個SYN-ACK段,客戶端收到后從connect返回,同時應(yīng)答一個ACK段,服務(wù)器收到后從accept返回。
數(shù)據(jù)傳輸?shù)倪^程:建立連接后,TCP協(xié)議提供全雙工的通信服務(wù),但是一般的客戶端/服務(wù)器程序的流程是由客戶端主動發(fā)起請求,服務(wù)器被動處理請求,一問一答的方式。因此,服務(wù)器從accept返回后立刻調(diào)用read,讀socket就像讀管道一樣,如果沒有數(shù)據(jù)到達就阻塞等待,這時客戶端調(diào)用write發(fā)送請求給服務(wù)器,服務(wù)器收到后從read返回,對客戶端的請求進行處理,在此期間客戶端調(diào)用read阻塞等待服務(wù)器的應(yīng)答,服務(wù)器調(diào)用write將處理結(jié)果發(fā)回給客戶端,再次調(diào)用read阻塞等待下一條請求,客戶端收到后從read返回,發(fā)送下一條請求,如此循環(huán)下去。
如果客戶端沒有更多的請求了,就調(diào)close關(guān)閉連接,就像寫端關(guān)閉的管道一樣,服務(wù)器的read返回0,這樣服務(wù)器就知道客戶端關(guān)閉了連接,也調(diào)用close關(guān)閉連接。注意,任何一方調(diào)用close后,連接的兩個傳輸方向都關(guān)閉,不能再發(fā)送數(shù)據(jù)了。如果一方調(diào)用shutdown則連接處于半關(guān)閉狀態(tài),仍可接收對方發(fā)來的數(shù)據(jù)。
二、代碼實現(xiàn)
1.Makefile的編寫
2.服務(wù)器代碼實現(xiàn)
3.客戶端代碼實現(xiàn)
三、結(jié)果展示
Tags:調(diào)用服務(wù)器,TCP服務(wù)器
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。