如何让服务器端持续监听客户端的请求?
发布时间:2020-12-15 17:30:54 所属栏目:百科 来源:网络整理
导读:前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。 修改前面的回声程序,使服务器端可以不断响应客户端的请求。 服务器端 ser
前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。 修改前面的回声程序,使服务器端可以不断响应客户端的请求。 服务器端 server.cpp: #include <stdio.h> #include <winsock2.h> #pragma comment (lib,"ws2_32.lib") //加载 ws2_32.dll #define BUF_SIZE 100 int main(){ WSADATA wsaData; WSAStartup( MAKEWORD(2,2),&wsaData); //创建套接字 SOCKET servSock = socket(AF_INET,SOCK_STREAM,0); //绑定套接字 sockaddr_in sockAddr; memset(&sockAddr,sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family = PF_INET; //使用IPv4地址 sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址 sockAddr.sin_port = htons(1234); //端口 bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR)); //进入监听状态 listen(servSock,20); //接收客户端请求 SOCKADDR clntAddr; int nSize = sizeof(SOCKADDR); char buffer[BUF_SIZE] = {0}; //缓冲区 while(1){ SOCKET clntSock = accept(servSock,(SOCKADDR*)&clntAddr,&nSize); int strLen = recv(clntSock,buffer,BUF_SIZE,0); //接收客户端发来的数据 send(clntSock,strLen,0); //将数据原样返回 closesocket(clntSock); //关闭套接字 memset(buffer,BUF_SIZE); //重置缓冲区 } //关闭套接字 closesocket(servSock); //终止 DLL 的使用 WSACleanup(); return 0; } 客户端 client.cpp: #include <stdio.h> #include <WinSock2.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") //加载 ws2_32.dll #define BUF_SIZE 100 int main(){ //初始化DLL WSADATA wsaData; WSAStartup(MAKEWORD(2,&wsaData); //向服务器发起请求 sockaddr_in sockAddr; memset(&sockAddr,sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family = PF_INET; sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockAddr.sin_port = htons(1234); char bufSend[BUF_SIZE] = {0}; char bufRecv[BUF_SIZE] = {0}; while(1){ //创建套接字 SOCKET sock = socket(PF_INET,IPPROTO_TCP); connect(sock,sizeof(SOCKADDR)); //获取用户输入的字符串并发送给服务器 printf("Input a string: "); gets(bufSend); send(sock,bufSend,strlen(bufSend),0); //接收服务器传回的数据 recv(sock,bufRecv,0); //输出接收到的数据 printf("Message form server: %sn",bufRecv); memset(bufSend,BUF_SIZE); //重置缓冲区 memset(bufRecv,BUF_SIZE); //重置缓冲区 closesocket(sock); //关闭套接字 } WSACleanup(); //终止使用 DLL return 0; }先运行服务器端,再运行客户端,结果如下: Input a string: c language Message form server: c language Input a string: C语言中文网 Message form server: C语言中文网 Input a string: 学习C/C++编程的好网站 Message form server: 学习C/C++编程的好网站 while(1) 让代码进入死循环,除非用户关闭程序,否则服务器端会一直监听客户端的请求。客户端也是一样,会不断向服务器发起连接。 需要注意的是:server.cpp 中调用 closesocket() 不仅会关闭服务器端的 socket,还会通知客户端连接已断开,客户端也会清理 socket 相关资源,所以 client.cpp 中需要将 socket() 放在 while 循环内部,因为每次请求完毕都会清理 socket,下次发起请求时需要重新创建。后续我们会进行详细讲解。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |