我写了一个服务器,它应该在打开与客户端的连接后等待来自客户端的消息:
while(1){
if(recv(mySocket, buffer, 1000, 0) < 1){
continue;
}
printf("Message received: %s", buffer);
}
我用 wireshark 检查了哪些数据包被发送到这个服务器,但对于每个发送的数据包,都有 2 个 printf 输出。
我现在的问题是我从哪里得到这条额外的消息。
(附加消息是一些随机字节。但每次都一样。)
最佳答案
您对 recv()
行为的明显期望是不合理的。正如@KarolyHorvath 在评论中观察到的那样,流式套接字(其中包括基于 TCP 的套接字)对“消息”没有任何意义。特别是,网络数据包不对应于流套接字上的消息。 POSIX 对 recv()
的行为有这样的说法,事实上:
For stream-based sockets, [...] message boundaries shall be ignored.
虽然这更有可能产生组合多个“消息”的效果,但它可以也意味着单个消息(由单个 send()
调用分派(dispatch)) ) 拆分为多个 recv()
调用。这肯定将意味着如果您指定给recv()
的缓冲区长度小于套接字上实际接收到的字节数,但在其他情况下也能得到结果。
成功时,recv()
返回复制到接收缓冲区中的字节数。如果您真的想实现某种“消息”交换,那么您可以使用它来帮助您在消息边界上拆分传入数据。但是,请务必认识到,这构成了在流之上实现消息传递协议(protocol),因此发送方和接收方需要合作(至少是隐式合作)才能使其正常工作。
关于c - 当只发送一条消息时从接收中获取两条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558016/