資源描述:
《c++基于tcp和udp的socket通信》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、C++基于TCP和UDP的socket通信2011-08-1812:44?5562人閱讀?評論(5)?收藏?舉報sockettcpc++服務(wù)器streaminternet????TCP和UDP屬于傳輸層協(xié)議。其中TCP提供IP環(huán)境下的數(shù)據(jù)可靠傳輸,它事先為要發(fā)送的數(shù)據(jù)開辟好連接通道(三次握手),然后再進行數(shù)據(jù)發(fā)送;而UDP則不為IP提供可靠性,一般用于實時的視頻流傳輸,像rtp、rtsp就是建立在udp的基礎(chǔ)上的。????首先談?wù)則cpsocket???tcp簡單的三次握手過程如圖,???SYN(SynchronizeSequenceNumbers):同步
2、標(biāo)志 ???ACK(AcknowledgementNumber)????????:確認(rèn)標(biāo)志???圖中可以看出,三次握手的過程是在c的connect()和s的bind()、listen()、accept()函數(shù)中完成的,這樣開辟了相對可靠的連接通道,來傳輸數(shù)據(jù)。UDP的socket編程過程如下圖所示:下面翠花上代碼啦!服務(wù)端:[cpp]?viewplaincopy1.#include???2.#include??//windows?socket的頭文件??3.??4.#pragma?comment(?lib,?"ws
3、2_32.lib"?)//?鏈接Winsock2.h的靜態(tài)庫文件??5.??6.void?main()??7.{??8.????//初始化winsocket??9.????WORD?wVersionRequested;??10.????WSADATA?wsaData;??11.????int?err;??12.??13.????wVersionRequested?=?MAKEWORD(?1,?1?);//第一個參數(shù)為低位字節(jié);第二個參數(shù)為高位字節(jié)??14.??15.????err?=?WSAStartup(?wVersionRequested,?&wsaD
4、ata?);//對winsock?DLL(動態(tài)鏈接庫文件)進行初始化,協(xié)商Winsock的版本支持,并分配必要的資源。??16.????if?(?err?!=?0?)??17.????{??18.????????return;??19.????}??20.??21.????if?(?LOBYTE(?wsaData.wVersion?)?!=?1?
5、
6、HIBYTE(?wsaData.wVersion?)?!=?1?)//LOBYTE()取得16進制數(shù)最低位;HIBYTE()取得16進制數(shù)最高(最左邊)那個字節(jié)的內(nèi)容????????22.????{??23.?
7、???????WSACleanup(?);??24.????????return;??25.????}??26.??1.????SOCKET?sockSrv=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,對應(yīng)tcp;0指定網(wǎng)絡(luò)協(xié)議為TCP/IP??2.??3.????SOCKADDR_IN?addrSrv;???4.????addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);?//hto
8、nl用來將主機字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序(to?network?long)??5.????//INADDR_ANY就是指定地址為0.0.0.0的地址,??6.????//表示不確定地址,或“任意地址”?!??7.????addrSrv.sin_family=AF_INET;???8.????addrSrv.sin_port=htons(4000);//htons用來將主機字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序(to?network?short)??9.??10.????bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))
9、;//將本地地址綁定到所創(chuàng)建的socket上,以使在網(wǎng)絡(luò)上標(biāo)識該socket??11.??12.????listen(sockSrv,5);//socket監(jiān)聽,準(zhǔn)備接受連接請求。??13.??14.????SOCKADDR_IN?addrClient;??15.????int?len=sizeof(SOCKADDR);??16.??17.????while(1)??18.????{??19.????????SOCKET?sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//為一個連接請求提供服務(wù)。a
10、ddrClient包含了發(fā)出連接請求的客戶機IP地址信息;返回的新