3

以下是设置:

服务器客户端
 | |
接受连接
 | |
 v |
发送 msg1-> |
 | |
 vv
接收 <- 发送
 | |
 vv
发送 msg2-> recv
 | |
 vv
               关闭

这是我的问题:
1.客户端实际上在关闭之前收到了msg1,为什么会这样?
2.发送msg2正常返回。既然客户端收到msg1就关闭了,为什么send msg2成功了?

PS 我正在为 TCP 使用流套接字。

4

2 回答 2

5
  1. recv函数将获取接收缓冲区中的下一个内容。在客户端的情况下,如果套接字是数据报套接字,那么接下来是msg1。如果它是一个流套接字,则不维护消息边界,因此如果msg2已经到达并且在 recv 缓冲区中有空间,则 recv 可以包含来自msg1msg2的数据。

  2. send不等待recv消息的另一方,它只是将其添加到发送队列中。那时它不知道客户端是否会在读取连接之前关闭它。如果您需要知道您应该让客户端发送响应以确认消息。

于 2010-04-06T14:26:47.247 回答
4

建立连接后,操作系统会管理进出系统的数据包,recv() 调用仅读取数据包缓冲区,而 send() 调用仅将数据包排队。

于 2010-04-06T16:10:09.537 回答