C++ Socket通信的时候,第一次客户端可以收到服务器端的消息,第二次收不到

问题:C++ Socket通信的时候,第一次客户端可以收到服务器端的消息,第二次收不到,再之后有时候可以收到,有时候收不到,但服务器端有反应
服务器端的内容:

img

客户端的内容:

img

服务器端代码:

while (true)
        {               
            int Recv = recv(client_fd,recvBuf,sizeof(recvBuf),0);   //接受来自客户端的内容
            if (Recv<0)
            {
                cout<<"Error: Receive info from server failed!"<return -1;
            }
            cout<<"*********************************"<"查询次数:"<"receive data: "<float> dbData;
            dbData=mysql.PrintQueryResXYZ();                       
            int querySize = dbData.size();
            mysql.vec2string(dbData,strSendBuf,querySize);  //vector转换成string类型
            cout<char sendBuf[99999]={0}; //发送 1024
            strcpy(sendBuf,strSendBuf.c_str());     //string转换成char[]      
                  
            cout<<"查询到的数量:"<size()<"发送给客户端的数据..."<int Write = write(client_fd,sendBuf,sizeof(sendBuf));
            //int Send = send(client_fd,(char*)sendBuf,sizeof(sendBuf),0);    //发送给客户端
            if (Write<0)
            {
                cout << "Error: Send info to server failed !"<return -1;
            }
            cout<<"给客户端发送完成!"<"*********************************"<

img


客户端代码:

if (receive > 0)
    {
        cout << "从服务器端开始接收:" << recvbuf << endl;
        while (true)
        {
            char input[1024] = {0};   //键盘输入的字符
            receive = 0;
            cout << "发送给服务器端的内容:";
            cin.getline(input, 1024);   //cin以空格为分隔,输入的字符串中有空格的时候,会被分开
            if (!strcmp(input,"exit"))  //输入exit直接退出
            {
                send(Socket, input, sizeof(input), 0);
                return 0;
            }
            int Send = send(Socket, input, sizeof(input), 0); 
            memset(recvbuf, '\0', sizeof(recvbuf));
            //cout << receive << endl;
            receive = recv(Socket, recvbuf, sizeof(recvbuf), 0);
            
            if (receive >= 0)
            {
                cout << "从服务器端接收到的内容:\n" << recvbuf << endl;
            }
        }
    }

img

第二次查询时候,客户端的代码直接从第45行跳转到了第50行,48行的recv似乎没有执行

根据你提供的代码,我发现可能有两个问题:

1.第二次查询时,服务器端发送的数据可能太长,导致客户端接收到的数据长度不够,从而导致recv函数阻塞。
建议使用recv函数返回的实际接收数据长度作为send函数的参数,以保证数据的完整性。例如:

int Write = write(client_fd, sendBuf, strlen(sendBuf));  // 发送给客户端

2.客户端的代码中,第一个recv函数没有检查返回值是否小于等于0,这可能导致后续的recv函数无法正确执行。建议加上如下的错误处理代码:

if (receive <= 0)
{
    cout << "Error: Receive info from server failed!" << endl;
    return -1;
}


如果以上修改无法解决问题,请提供更详细的信息,例如程序运行过程中的输出信息,以便更好地定位问题。

那你同时在服务端也调试输出一下,第二次接收到客户端的信息了没?接收到了给客户端发信息了没?
顺藤摸瓜,自己就能找出来了

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^