c - 当只发送一条消息时从接收中获取两条消息

标签 c sockets networking

我写了一个服务器,它应该在打开与客户端的连接后等待来自客户端的消息:

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/

相关文章:

c++ - 数组索引类型 : signed/unsigned integer avantages

Java 套接字 : can you send from one thread and receive on another?

c - 多客户端 C 服务器的异步 C 客户端

networking - 如何在 open-vswitch 中将流量从特定端口转发到另一个端口

c - 文件的二进制兼容性*

c - 从缓冲区读取字节(字符)

java - 使用 native 库(仅限 C,无 C++),并且未找到实现

python - 为什么我的网络在传递数据之前要等到套接字或 websocket 连接关闭

linux - 在 Debian 中阻止网站

java - 使用 java 和 ports 发送文件