前面講解了Socket通信中服務(wù)端的每一步功能作用及實現(xiàn),而重點是多個步驟在一起時,上下文 函數(shù)之間的信息傳遞需要我們理解,如SOCKADDR_IN的結(jié)構(gòu)體、各個SOCKET描述符等參數(shù),以及在此基礎(chǔ)之上改進得到的希望的實際效果(如需要不停的接受消息、發(fā)送消息)
下面我們將所有步驟串聯(lián)在一起,提供一個可以連續(xù)接收客戶端信息的服務(wù)端程序,完整代碼供大家參考:
#include <winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData); //目前建議使用最新2.2版本 SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建了可識別套接字 if(serSocket!=-1) { printf("成功創(chuàng)建套接字!%d\n",serSocket); } //需要綁定的參數(shù),主要是本地的socket的一些信息。 SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址 addr.sin_port=htons(12345);//綁定端口 bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//綁定完成 listen(serSocket,5);//其中第二個參數(shù)代表能夠接收的最多的連接數(shù) printf("等待客戶端...\n"); SOCKADDR_IN clientsocket; int len=sizeof(SOCKADDR); //第二次握手,通過accept來接受對方的套接字的信息 SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len); //如果這里不是accept而是conection的話。。就會不斷的監(jiān)聽 if(serConn) { printf("監(jiān)聽到新的客戶端...\n"); } while (1) { char sendBuf[100]; sprintf(sendBuf,"welcome %s to here",inet_ntoa(clientsocket.sin_addr));//找對對應(yīng)的IP并且將這行字打印到那里 //發(fā)送信息 send(serConn,sendBuf,strlen(sendBuf)+1,0); char receiveBuf[100];//接收 int RecvLen; RecvLen=recv(serConn,receiveBuf,100,0); if(RecvLen!=-1) printf("%d %s\n",RecvLen,receiveBuf); else break; } closesocket(serConn);//關(guān)閉 WSACleanup();//釋放資源的操作 return 0; }
因為暫時沒有客戶端連接,運行后為等待效果狀態(tài),效果如下:
如果此時有本機有客戶端同時監(jiān)聽“12345”端口,即可以相互通信,具體客戶端代碼及實現(xiàn)請看第三章
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程