我能想到这些可能的答案:
- 直到数据被写入 IP 堆栈中的某个内部缓冲区。
- 直到数据通过网络发送。
- 直到收到来自另一台机器的接收确认。
直到数据写入发送方的发送缓冲区。
因此,如果缓冲区已满,它将阻塞。
如果由于网络问题或接收器端的接收缓冲区已满,发送缓冲区可能尚未发送数据,则发送缓冲区可能已满。
您可以进行一个实验:制作发送方和接收方,将发送方的套接字发送缓冲区设置为较小的值,将接收方的接收缓冲区设置为较小的值。
开始发送,在接收方接受连接,但不接收。当发送的字节数约为 SenderSendBuffer + ReceiverReceiveBuffer 时,套接字将被阻塞。
NetworkStream
不缓冲数据。最终,调用NetworkStream.Write
转换为套接字发送函数调用。此功能的 MSDN 文章说:
发送功能的成功完成并不表示数据已成功交付和接收到接收者。该函数仅表示数据发送成功。
这回答了你的问题了吗?