已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于TCP的Linux通訊學(xué)院:電子信息與電氣工程學(xué)院 班級(jí):13級(jí)網(wǎng)絡(luò)工程一班學(xué)號(hào):20131070131姓名:顏串懷1、 需求分析現(xiàn)創(chuàng)建兩個(gè)通訊端,服務(wù)器端和客戶機(jī)端,實(shí)現(xiàn)基于TCP的端到端的socket通訊。當(dāng)收到客戶機(jī)的鏈接請(qǐng)求是,建立通訊會(huì)話,客戶機(jī)發(fā)送消息,服務(wù)器把消息回顯在終端上。二、建立流程服務(wù)器端的步驟如下:1. socket: 建立一個(gè)socket2. bind: 將這個(gè)socket綁定在某個(gè)文件上(AF_UNIX)或某個(gè)端口上(AF_INET), 會(huì)分別介紹這兩種。3. listen: 開(kāi)始監(jiān)聽(tīng)4. accept: 如果監(jiān)聽(tīng)到客戶端連接,則調(diào)用accept接收這個(gè)連接并同時(shí)新建一個(gè)socket來(lái)和客戶進(jìn)行通信5. read/write:讀取或發(fā)送數(shù)據(jù)到客戶端6. close: 通信完成后關(guān)閉socket客戶端的步驟如下:1. socket: 建立一個(gè)socket2. connect: 主動(dòng)連接服務(wù)器端的某個(gè)文件(AF_UNIX)或某個(gè)端口(AF_INET)3. read/write:如果服務(wù)器同意連接(accept),則讀取或發(fā)送數(shù)據(jù)到服務(wù)器端4. close: 通信完成后關(guān)閉socket三、相關(guān)函數(shù)簡(jiǎn)介1.int socket(int domain, int type, int protocol)domain:指定socket所屬的域,常用的是AF_UNIX或AF_INETAF_UNIX表示以文件方式創(chuàng)建socket,AF_INET表示以端口方式創(chuàng)建sockettype:指定socket的類型,可以是SOCK_STREAM或SOCK_DGRAMSOCK_STREAM表示創(chuàng)建一個(gè)TCP鏈接,有序的,可靠的,面向連接的socketSOCK_DGRAM表示創(chuàng)建一個(gè)UDP,不可靠的,無(wú)連接的socketprotocol:指定socket的協(xié)議類型,一般指定為0表示由第一第二兩個(gè)參數(shù)自動(dòng)選擇。socket()函數(shù)返回新創(chuàng)建的socket,出錯(cuò)則返回-12.地址格式:常用的有兩種socket域:AF_UNIX或AF_INET,因此就有兩種地址格式:sockaddr_un和sockaddr_in,分別定義如下:structsockaddr_unsa_family_tsun_family;/*AF_UNIX*/ charsun_path;/*pathname*/ structsockaddr_inshortintsin_family;/*AF_INET*/unsignedshortintsin_port;/*portnumber*/structin_addrsin_addr;/*internetaddress*/其中in_addr正是用來(lái)描述一個(gè)ip地址的:structin_addrunsignedlongints_addr;sun_path存放socket的本地文件名,sin_addr存放socket的ip地址,sin_port存放socket的端口號(hào)。3.創(chuàng)建完一個(gè)socket后, 需要使用bind將其綁定:int bind(int socket, const struct sockaddr * address, size_t address_len)如果 使用AF_UNIX來(lái)創(chuàng)建socket,相應(yīng)的地址格式是sockaddr_un,而如果 使用AF_INET來(lái)創(chuàng)建socket,相應(yīng)的地址格式是sockaddr_in,因此 需要將其強(qiáng)制轉(zhuǎn)換為sockaddr這一通用的地址格式類型,而sockaddr_un中的sun_family和sockaddr_in中的sin_family分別說(shuō)明了它的地址格式類型,因此bind()函數(shù)就知道它的真實(shí)的地址格式。第三個(gè)參數(shù)address_len則指明了真實(shí)的地址格式的長(zhǎng)度。bind()函數(shù)正確返回0,出錯(cuò)返回-14.接下來(lái) 需要開(kāi)始監(jiān)聽(tīng)了:int listen(int socket, int backlog)backlog:等待連接的最大個(gè)數(shù),如果超過(guò)了這個(gè)數(shù)值,則后續(xù)的請(qǐng)求連接將被拒絕listen()函數(shù)正確返回0,出錯(cuò)返回-15.接受連接:int accept(int socket, struct sockaddr * address, size_t * address_len)同樣,第二個(gè)參數(shù)也是一個(gè)通用地址格式類型,這意味著 需要進(jìn)行強(qiáng)制類型轉(zhuǎn)化這里需要注意的是,address是一個(gè)傳出參數(shù),它保存著接受連接的客戶端的地址,如果 不需要,將address置為NULL即可。address_len: 期望的地址結(jié)構(gòu)的長(zhǎng)度,注意,這是一個(gè)傳入和傳出參數(shù),傳入時(shí)指定 期望的地址結(jié)構(gòu)的長(zhǎng)度,如果多于這個(gè)值,則會(huì)被截?cái)?,而?dāng)accept()函數(shù)返回時(shí),address_len會(huì)被設(shè)置為客戶端連接的地址結(jié)構(gòu)的實(shí)際長(zhǎng)度。另外如果沒(méi)有客戶端連接時(shí),accept()函數(shù)會(huì)阻塞accept()函數(shù)成功時(shí)返回新創(chuàng)建的socket描述符,出錯(cuò)時(shí)返回-16.客戶端通過(guò)connect()函數(shù)與服務(wù)器連接:int connect(int socket, const struct sockaddr * address, size_t address_len)對(duì)于第二個(gè)參數(shù), 同樣需要強(qiáng)制類型轉(zhuǎn)換address_len指明了地址結(jié)構(gòu)的長(zhǎng)度connect()函數(shù)成功時(shí)返回0,出錯(cuò)時(shí)返回-17.雙方都建立連接后,就可以使用常規(guī)的read/write函數(shù)來(lái)傳遞數(shù)據(jù)了8.通信完成后,需要關(guān)閉socket:int close(int fd)close是一個(gè)通用函數(shù)(和read,write一樣),不僅可以關(guān)閉文件描述符,還可以關(guān)閉socket描述符四、AF_UNIX和AF_INET區(qū)別主要的不同就是頭文件去掉了,加入了和由于選擇了AF_INET,因此需要使用sockaddr_in地址結(jié)構(gòu)體,其中的sin_addr存放ip地址,sin_port存放端口號(hào)。需要通過(guò)inet_addr()函數(shù)將ip地址字符串轉(zhuǎn)換成內(nèi)部的表示形式。另外由于intel機(jī)器使用little-endian順序,和網(wǎng)絡(luò)數(shù)據(jù)的big-endian順序不一致,因此 需要使用htons()函數(shù)進(jìn)行轉(zhuǎn)換(因?yàn)槎丝谑?6位,因此使用short)unsigned long int htonl(unsigned long int hostlong)unsigned short int htons(unsigned short int hostshort)unsigned long int ntohl(unsigned long int netlong)unsigned short int ntohs(unsigned short int netshort)htonl,host to net, longhtons,host to net, shortntohl,net to host, longntohs,net to host, short五、編程代碼/*socket tcp服務(wù)器端*/#include #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 6666int main()int serverSocket;struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer200;int iDataNum;if(serverSocket = socket(AF_INET, SOCK_STREAM, 0) 0)perror(socket);return 1;bzero(&server_addr, sizeof(server_addr);server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr) 0)perror(connect);return 1;if(listen(serverSocket, 5) 0) perror(listen);return 1;while(1)printf(Listening on port: %dn, SERVER_PORT);client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);if(client 0)perror(accept);continue;printf(nrecv client data.n);printf(IP is %sn, inet_ntoa(clientAddr.sin_addr);printf(Port is %dn, htons(clientAddr.sin_port);while(1)iDataNum = recv(client, buffer, 1024, 0);if(iDataNum 0)perror(recv);continue;bufferiDataNum = 0;if(strcmp(buffer, quit) = 0)break;printf(%drecv data is %sn, iDataNum, buffer);send(client, buffer, iDataNum, 0);return 0;/*socket tcp客戶端*/#include #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 6666int main()int clientSocket;struct sockaddr_in serverAddr;char sendbuf200;char recvbuf200;int iDataNum;if(clientSocket = socket(AF_INET, SOCK_STREAM, 0) 0)perror(socket);return 1;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);serverAddr.sin_addr.s_addr = inet_addr();if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr) );scanf(%s, sendbuf);printf(n);send(clientSocket, sendbuf, strlen(sendbuf), 0);if(strcmp(sendbuf, quit) = 0)break;iDataNum = recv(clientSocket, recvbuf, 200, 0);recvbufiDataNum = 0;printf(recv data of my world is: %sn, recvbuf);close(clientSocket);r
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球核電用鋼管行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)鋼制垂直推拉門行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球微孔織物行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球半導(dǎo)體電鍍前處理劑行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球熱水箱行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)手機(jī)支付安全行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)超高壓HPP滅菌設(shè)備行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 液氨運(yùn)輸合同模板
- 2025員工入股合同(美容美發(fā))
- 外墻保溫勞務(wù)分包合同
- Unit6AtthesnackbarStorytimeDiningwithdragons(課件)譯林版英語(yǔ)四年級(jí)上冊(cè)
- 2023年四川省公務(wù)員錄用考試《行測(cè)》真題卷及答案解析
- 機(jī)電一體化系統(tǒng)設(shè)計(jì)-第5章-特性分析
- 2025年高考物理復(fù)習(xí)壓軸題:電磁感應(yīng)綜合問(wèn)題(原卷版)
- 雨棚鋼結(jié)構(gòu)施工組織設(shè)計(jì)正式版
- 醫(yī)院重點(diǎn)監(jiān)控藥品管理制度
- 2024尼爾森IQ中國(guó)本土快消企業(yè)調(diào)研報(bào)告
- 2024年印度辣椒行業(yè)狀況及未來(lái)發(fā)展趨勢(shì)報(bào)告
- 骨科醫(yī)院感染控制操作流程
- 鑄鋁焊接工藝
- 《社區(qū)康復(fù)》課件-第六章 骨關(guān)節(jié)疾病、損傷患者的社區(qū)康復(fù)實(shí)踐
評(píng)論
0/150
提交評(píng)論