以下是设置:
服务器客户端 | | 接受连接 | | v | 发送 msg1-> | | | vv 接收 <- 发送 | | vv 发送 msg2-> recv | | vv 关闭
这是我的问题:
1.客户端实际上在关闭之前收到了msg1,为什么会这样?
2.发送msg2正常返回。既然客户端收到msg1就关闭了,为什么send msg2成功了?
PS 我正在为 TCP 使用流套接字。
该recv
函数将获取接收缓冲区中的下一个内容。在客户端的情况下,如果套接字是数据报套接字,那么接下来是msg1。如果它是一个流套接字,则不维护消息边界,因此如果msg2已经到达并且在 recv 缓冲区中有空间,则 recv 可以包含来自msg1和msg2的数据。
send
不等待recv
消息的另一方,它只是将其添加到发送队列中。那时它不知道客户端是否会在读取连接之前关闭它。如果您需要知道您应该让客户端发送响应以确认消息。
建立连接后,操作系统会管理进出系统的数据包,recv() 调用仅读取数据包缓冲区,而 send() 调用仅将数据包排队。