c - 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() 发送消息。
解决方案
推荐阅读
- android - 地图片段上方的标题
- python - 在条件语句上打印不起作用
- powershell - 无法使用 Keyvault Secrets 进行域加入
- c - 二叉搜索树中的分段错误(核心转储)
- php - Magento 2 在下订单和重定向到购物车时出现致命错误
- google-cloud-platform - 监控谷歌发布订阅
- angular - Angular AUTO alert-dismissible 不起作用
- python - Keras - VGG 微调模型给出错误的预测
- swift-package-manager - 快速包管理器没有找到 KituraNet
- maven - Maven 使用 Kuali S3 Wagon - 如何将 AWS 凭证移动到 pom.xml?