以下是设置:
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套接字套接字。
答案 0 :(得分:5)
recv
函数将获取接收缓冲区中的下一个函数。对于客户端,如果套接字是数据报套接字,则下一步是 msg1 。如果它是流套接字,那么不会维护消息边界,因此如果 msg2 已到达,那么recv可能包含来自 msg1 和 msg2 的数据在recv缓冲区中是两个空间。
send
不等待对方recv
消息,它只是将其添加到发送队列。此时不知道客户端在读取之前是否会关闭连接。如果您需要知道您应该让客户发送回复以确认该消息。
答案 1 :(得分:4)
建立连接后,操作系统管理进出系统的数据包,recv()调用只读取数据包缓冲区,而send()调用只是对数据包进行排队。