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

时间:2010-04-06 13:38:22

标签: 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成功?

P.S。我正在使用TCP套接字套接字。

2 个答案:

答案 0 :(得分:5)

  1. recv函数将获取接收缓冲区中的下一个函数。对于客户端,如果套接字是数据报套接字,则下一步是 msg1 。如果它是流套接字,那么不会维护消息边界,因此如果 msg2 已到达,那么recv可能包含来自 msg1 msg2 的数据在recv缓冲区中是两个空间。

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

答案 1 :(得分:4)

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