This question already has answers here:
Closed 3 years ago.
Are parallel calls to send/recv on the same socket valid?
(3个答案)
套接字通常可以双向通信,因此同一个套接字可用于sendrecv
如果我想在读取套接字时(在另一个线程上)发送一些数据,内核会怎么做?这适用于两个部分。
考虑这个例子:服务器正在给你一个文件,并说它需要很多(低上行链路或一个很大的文件)。用户感到厌烦并决定send您。您捕获它并告诉服务器停止发送文件(带有某种消息)。
您是否可以发送以告诉服务器停止发送,即使您正在读取?当然,这也适用于服务器端。
希望我说得够清楚了。

最佳答案

如果我想在读取套接字时(在另一个线程上)发送一些数据,内核会怎么做?
没什么特别的。。。插座不像花园水管。。。在机器之间发送的数据包中只添加了一些元数据,因此读和写是独立进行的(除了一方在套接字上调用recv()之外,该套接字由于the Nagle algorithm而在本地缓冲区中有未发送的数据,该套接字将数据聚集成合理大小的数据包,它可能会立即超时并发送它能发送的任何内容,但是任何这方面的调整都是一个实现延迟调整细节,不会改变客户机和服务器调用TCP API的总体情况或方式)。
考虑这个例子:服务器向您发送一个文件,并说它需要很多时间(低上行链路或非常大的文件)。用户觉得无聊,决定给你发信号。您捕获它并告诉服务器停止发送文件(带有某种消息)。您是否可以发送以告诉服务器停止发送,即使您正在读取?当然,这也适用于服务器端。
内核接受要发送的有限数量的数据和接收的有限数量的数据,然后它迫使发送端等待一些数据被消耗,然后再发送更多的数据。所以,如果您已经向服务器发送了数据,那么获取一个本地SIGINT并以同样的方式发送一个“哦,取消那个”,服务器必须先读取所有已发送的数据,然后才能看到“哦,取消那个”。如果在发送cancel消息时打开Out-of-Band(OOB)标志而不是“以相同的方式”发送,那么服务器可以(如果它是这样写的)检测到有OOB数据,并在完成其他数据的读取/处理之前读取它。它仍然需要读取和丢弃您已经发送的任何带内数据,但是上面提到的流控制/缓冲意味着这应该是一个可管理的量-远远小于您的文件大小。在整个过程中,无论您想接收什么或服务器发送什么,都是独立的,不受大型客户机->服务器发送、任何OOB数据等的影响。。
http://www.gnu.org/software/libc/manual/html_node/Out_002dof_002dBand-Data.html上有一个来自GNU的讨论和示例代码

10-08 08:34
查看更多