首页 > 解决方案 > Recv()(在客户端应用程序上)未接收到从服务器发送的所有消息。(IP/TCP)

问题描述

在此处输入图像描述我希望在保留消息边界的同时向客户端发送不同长度的消息。为此,只要他发送的下一条消息大小不同,服务器就会发送一条特殊消息。客户端,对接收实体进行了 realloc 调用,这似乎工作正常。

消息从服务器正确发送(send() 的返回值不是 -1),但是,客户端的 recv 只读取(随机)数量的字母,通常不接收最后的消息(最多 8 个 un - 阅读但已发送消息),但其他时候似乎工作得很好。这并不总是发生,也没有特定的模式。我尝试了一些测试,发现 recv (..., msg_peek) 返回值为 -1 ,而消息正在发送到缓冲区。

我在接收循环 (while) 上使用了标志 MSG_PEEK。

while (recv(sock,message_rec,lg_attendue,MSG_PEEK)>0)
    {
      
    

       if (!Bal_Detection_Lettre(message_rec)) //detects a message containing info about the size of the next one
     {

       expected= Bal_Detection_Longueur_Message(message_rec,  30) ;
       message_rec=(char *) realloc(message_rec , expected *sizeof(char));
       printf("expected : %d\n" , expected);
       recv(sock,message_rec,lg_attendue,0);
     }
       else {

     recv(sock,message_rec,expected,0);
     display_message(message_recu,expected) ; //function displaying the message
       }

    }
  
  printf("expected : %d\n",expected) ; 
  
}

服务器端代码没有什么特别之处,它在关闭连接之前使用 send() 发送消息。

标签: csocketstcpnetwork-programming

解决方案


推荐阅读