一个小菜汪 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 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系