socket()和recv()在套接字通信中的行为

gc *_*c . 3 sockets send recv

以下是设置:

Server         Client
 |                |
accept         connect
 |                |
 v                |
send msg1->       | 
 |                |
 v                v
recv    <-     send
 |                |
 v                v
send msg2->    recv
 |                |
 v                v
               close

这是我的问题:
1.客户端在关闭之前实际收到msg1,为什么会这样?
2.发送msg2正常返回.由于客户端在收到msg1后关闭,为什么发送msg2成功?

PS我正在使用TCP的流套接字.

mar*_*k4o 5

  1. recv函数将获取接收缓冲区中的下一个内容.对于客户端,如果套接字是数据报套接字,那么下一步是msg1.如果它是流套接字,则不保留消息边界,因此如果msg2已到达,则recv可以包括来自msg1msg2的数据,并且recv缓冲区中有两个空间.

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