一个小菜汪 2023-02-20 15:19 采纳率: 47.1%
浏览 23
已结题

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!"<<endl;
                return -1;
            }
            cout<<"*********************************"<<endl;
            cout<<"查询次数:"<<queryCount<<endl;
            cout<<"receive data: "<<recvBuf<<endl;
        
            MYSQL_RES* resX = mysql.QueryData(recvBuf);
            vector<float> dbData;
            dbData=mysql.PrintQueryResXYZ();                       
            int querySize = dbData.size();
            mysql.vec2string(dbData,strSendBuf,querySize);  //vector转换成string类型
            cout<<strSendBuf<<endl;
            char sendBuf[99999]={0}; //发送 1024
            strcpy(sendBuf,strSendBuf.c_str());     //string转换成char[]      
                  
            cout<<"查询到的数量:"<<dbData.size()<<endl;   
            queryCount++;     
            cout<<"发送给客户端的数据..."<<endl;
            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 !"<<endl;
                return -1;
            }
            cout<<"给客户端发送完成!"<<endl;  
            cout<<"*********************************"<<endl;
        }

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似乎没有执行

  • 写回答

3条回答 默认 最新

  • MarkHan_ 2023-02-20 15:24
    关注

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

    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;
    }
    
    
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月28日
  • 已采纳回答 2月20日
  • 创建了问题 2月20日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效