前面讲解了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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程