加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何让服务器端持续监听客户端的请求?

发布时间: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,下次发起请求时需要重新创建。后续我们会进行详细讲解。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读