前面讲解了Socket通信中服务端的每一步功能作用及实现,而重点是多个步骤在一起时,上下文 函数之间的信息传递需要我们理解,如SOCKADDR_IN的结构体、各个SOCKET描述符等参数,以及在此基础之上改进得到的希望的实际效果(如需要不停的接受消息、发送消息)
下面我们将所有步骤串联在一起,提供一个可以连续接收客户端信息的服务端程序,完整代码供大家参考:
#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);//创建了可识别套接字 if(serSocket!=-1) { printf("成功创建套接字!%d\n",serSocket); } //需要绑定的参数,主要是本地的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);//其中第二个参数代表能够接收的最多的连接数 printf("等待客户端...\n"); SOCKADDR_IN clientsocket; int len=sizeof(SOCKADDR); //第二次握手,通过accept来接受对方的套接字的信息 SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len); //如果这里不是accept而是conection的话。。就会不断的监听 if(serConn) { printf("监听到新的客户端...\n"); } while (1) { char sendBuf[100]; sprintf(sendBuf,"welcome %s to here",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里 //发送信息 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);//关闭 WSACleanup();//释放资源的操作 return 0; }
因为暂时没有客户端连接,运行后为等待效果状态,效果如下:
如果此时有本机有客户端同时监听“12345”端口,即可以相互通信,具体客户端代码及实现请看第三章
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程