sockets - socket通信中send()和recv()的行为

标签 sockets send recv

以下是设置:

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

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

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

最佳答案

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

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

关于sockets - socket通信中send()和recv()的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585195/

相关文章:

javascript - 如何使用 socket.io 判断哪个套接字连接单击了按钮?

c - 如果使用 Ctrl+c 关闭客户端,服务器会在 `send` 死机

android - 整合推特 : why can’t I post status without having to authenticate?

python - 使用 Python 发送文件和文件名

c++ - 在 C/C++ 中同时与 Openssl epoll 服务器通信到多个客户端

c - 套接字收到的字节数少于发送的字节数

c - 如何使用 recv 逐行读取 html 页面?

c - Recv() 一次一行

PHP socket_connect() 权限被拒绝

file - SFTP 使用 bash 脚本发送文件