我可以想到以下可能的答案:
- 直到数据被写入IP堆栈中的某个内部缓冲区。
- 直到数据被发送到网络上。
- 直到从另一台机器接收到接收确认。
我可以想到以下可能的答案:
在发送方将数据写入发送缓冲区之前,数据是不会被发送的。
因此,如果缓冲区已满,它将被阻塞。
如果由于网络问题或接收方接收缓冲区已满而未传输数据,则发送缓冲区可能已满。
您可以进行一项实验:创建一个发送方和一个接收方,将发送方套接字的发送缓冲区设置为较小值,将接收方的接收缓冲区也同样设置为较小值。
开始发送数据,在接收方接受连接后,但不要接收数据。当发送的字节数约为SenderSendBuffer + ReceiverReceiveBuffer时,套接字将被阻塞。
NetworkStream
不会缓存数据。最终,对 NetworkStream.Write
的调用将转换为套接字 send 函数调用。该函数的 MSDN 文章如下所述:
发送函数的成功完成并不表示数据已成功传递和接收到接收方。此函数仅表示数据已成功发送。
这回答了你的问题吗?