【发布时间】:2018-09-12 07:21:39
【问题描述】:
我正在从 Richard Blum 的一本名为“C# Network Programming”的书中阅读有关套接字的内容。以下摘录指出 Send() 方法不能保证发送传递给它的所有数据。
byte[] data = new byte[1024]; int sent = socket.Send(data);根据这段代码,您可能会认为 整个 1024 字节的数据缓冲区被发送到远程设备……但这 可能是一个糟糕的假设。取决于内部 TCP 的大小 缓冲区以及正在传输的数据量,有可能不是 提供给 Send() 方法的所有数据实际上都已发送。
但是,当我查看 Microsoft 文档 https://msdn.microsoft.com/en-us/library/w93yy28a(v=vs.110).aspx 时,它说:
如果您使用的是面向连接的协议,Send 将阻塞,直到 缓冲区中的所有字节都被发送,除非设置了超时
那是什么?这本书是 2004 年出版的,那么从那以后它有什么变化吗?
我打算使用异步套接字,所以我的下一个问题是,BeginSend() 会发送所有数据吗?
【问题讨论】:
-
你没在文档里看到吗 - "Returns: The number of bytes sent to the Socket"
-
@Micky:忽略文档以支持黑盒观察是一个非常糟糕的主意,这会导致代码在其他计算机上失败,在 Windows 更新之后,甚至当您的计算机碰巧有更多或准备好同时运行的线程更少。
-
@BenVoigt 也许吧。但是话又说回来,文档形成了合同,如果行为取决于环境,那么文档应该这样说
-
@MickyD:确实,文档形成了合同。所有环境都必须遵守该合同。某些环境可能做得更多,但文档不需要详细说明合同之外的任何内容。
-
@BenVoigt 好的,谢谢哥们