前面讲解了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”端口,即可以相互通信,具体客户端代码及实现请看第三章
本文固定URL:https://www.dotcpp.com/course/793