假设我使用阻塞式套接字快速写入数据 [我已将所有数据存储在内存中]。另外,假设对方会非常缓慢地读取数据[比如在每次读取之间睡眠1秒钟]。
在这种情况下,写入方的预期行为是什么?写操作会阻塞直到对方读取足够的数据,还是会返回错误,例如连接重置?
在这种情况下,写入方的预期行为是什么?写操作会阻塞直到对方读取足够的数据,还是会返回错误,例如连接重置?
send()
调用将会一直阻塞,直到所有数据都被拷贝到该连接的网络堆栈缓冲区中。此时不需要等待另一侧进行数据接收。该缓冲区的大小取决于具体实现。send()
调用的更多数据。当所有这些数据都被拷贝后,该调用将返回。recv()
的速度进行send()
调用。输出(发送)缓冲区被填满直到它变满,send()
会阻塞,直到缓冲区被释放足够多的空间来排队数据包。
正如send
手册页面所说:
当消息无法适应套接字的发送缓冲区时,send()通常会阻塞,除非套接字已被置于非阻塞I/O模式。
请参考:http://manpages.ubuntu.com/manpages/lucid/man2/send.2.html