前面讲解了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”端口,即可以相互通信,具体客户端代码及实现请看第三章

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)