當(dāng)前位置:
首頁 >
c++ socket学习(1.1)
發(fā)布時(shí)間:2023/12/1
49
豆豆
生活随笔
收集整理的這篇文章主要介紹了
c++ socket学习(1.1)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文學(xué)習(xí)相關(guān)資料:
C/C++ socket編程教程
環(huán)境:vs2015
源碼:本文代碼
windows 如何創(chuàng)建客戶端與服務(wù)端通信?
TCP:
服務(wù)端
在windows先告訴程序我們要使用哪個(gè)版本的winsock,成功調(diào)用了它才能繼續(xù)下去
#pragma comment (lib,"ws2_32.lib") //連接ws2_32.lib /* MAKEWORD(2,2)表示使用2.2版本的 WSA:Windows Socket API Startup:啟動(dòng) */ WSADATA wsadata; WSAStartup(MAKEWORD(2, 2), &wsadata)然后是創(chuàng)建一個(gè)套接字:
/* 這樣就創(chuàng)建了一個(gè)套接字了 PF_INET:表示使用ipv4 SOCK_STREAM:表示使用面向連接的數(shù)據(jù)傳輸方式 IPROTO_TCP:表示使用TCP協(xié)議 */ SOCKET servSock = SOCKET(PF_INET,SOCK_STREAM, IPPROTO_TCP);然后創(chuàng)建sockaddr_in,用來將上面socket和ip地址、端口綁定
/* sockaddr_in 是一個(gè)結(jié)構(gòu)體 sin_family:使用了ipv4地址 sin_addr.s_add:要綁定的ip地址 sin_port:要綁定的端口inet_addr():將ip地址從字符串轉(zhuǎn)為整數(shù),每個(gè)32位的ip地址都有一個(gè)對(duì)應(yīng)的整數(shù) htons():將整型變量從主機(jī)字節(jié)順序轉(zhuǎn)變成網(wǎng)絡(luò)字節(jié)順序 每臺(tái)電腦可能由于系統(tǒng)或配置差異導(dǎo)致字節(jié)順序不同,這時(shí)大家協(xié)商好網(wǎng)絡(luò)字節(jié)的順序, 在通信前先將自己的字節(jié)順序轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)順序,再發(fā)送; 在接受到信息后再轉(zhuǎn)回自己的字節(jié)順序。*/ sockaddr_in servAddr; servAddr.sin_family = AF_INET; //servAddr.sin_addr.s_add = inet_addr("127.0.0.1"); //要使用inet_pton需要包括頭文件:WS2tcpip.h //這里使用inet_pton來填寫IP地址的原因是vs2015整天告訴我說inet_addr不安全 inet_pton(AF_INET,"127.0.0.1", &sockAddr.sin_addr.s_addr); //說明要監(jiān)聽的ip地址servAddr.sin_port = htons(9000);/* 這里第二個(gè)參數(shù)是SOCKADDR*類型的,結(jié)構(gòu)和sockaddr_in類似 *///綁定 bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));現(xiàn)在將端口和IP地址都綁定好了,可以開始監(jiān)聽有沒有人要連接這個(gè)端口了
/* 第一個(gè)參數(shù)表示用來監(jiān)聽的套接字 第二個(gè)參數(shù)表示隊(duì)列長度,來訪問的人都在這個(gè)隊(duì)列里面,等待接收 */listen(servSock,20);現(xiàn)在有客戶端發(fā)來連接請(qǐng)求了,要怎么接受連接呢
/* accept 取出隊(duì)列的第一個(gè)連接請(qǐng)求 第一個(gè)參數(shù):在listen的那個(gè)socket 第二個(gè)參數(shù):客戶端的IP地址和端口 第三個(gè)參數(shù):SOCKADDR的大小*/ int nSize = sizeof(SOCKADDR); socketaddr_in clnAddr; SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize)那現(xiàn)在成功接受請(qǐng)求了,那么要怎么接收發(fā)送的數(shù)據(jù)呢?
/* recv 接收客戶端發(fā)來的數(shù)據(jù),默認(rèn)是阻塞的(也就是程序會(huì)一直等到客戶端發(fā)信息來,否則不會(huì)往下執(zhí)行) 第一個(gè)參數(shù):accept時(shí)候返回的套接字 第二個(gè)參數(shù):數(shù)據(jù)保存的地方 第三個(gè)參數(shù):讀取數(shù)據(jù)的最大長度(字節(jié)) 返回值:實(shí)際讀取了多少個(gè)字節(jié)的數(shù)據(jù) */ int maxlen = 200; char buf[maxlen] int len = recv(clntSock, buf, maxlen, 0)好了現(xiàn)在服務(wù)端接收到關(guān)閉的信息了,要怎么關(guān)閉呢
/* 記得都要關(guān)閉哦 CleanUp:清理 */ closesocket(clntSock); closesocket(servSock); WSACleanup();客戶端
前面和服務(wù)端類似,都是需要?jiǎng)?chuàng)建套接字,說明服務(wù)端的IP地址和端口
記得在這前面要說明使用的socket 版本哦
然后可以開始連接了
/* 這個(gè)和bind函數(shù)類似,只不過那個(gè)是綁定,這個(gè)連接,連接成功是返回0,否則返回-1 */ connect(client, (sockaddr*)&servAddr, sizeof(sockaddr_in));好的,現(xiàn)在客戶端連接上了,是時(shí)候發(fā)送信息過去了
/* send 第一個(gè)參數(shù):連接成功的那個(gè)套接字 第二個(gè)參數(shù):發(fā)送的內(nèi)容 第三個(gè)參數(shù):發(fā)送的內(nèi)容長度 第四個(gè)參數(shù):?? */ send(client,"Hello Server",13,0);好了,信息發(fā)過去了,我這邊也要關(guān)閉了
closesocket(client); WSACleanup();總結(jié)
以上是生活随笔為你收集整理的c++ socket学习(1.1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 基本排序算法学习
- 下一篇: c++ socket学习(1.2)