![]() |
1
7
你是 假设 当你发送的时候,所有的数据都集中在一个包里,你将在另一端接收所有的数据。这不是TCP/IP的工作方式。这是一个流协议——你不应该对一次能收到多少数据做任何假设。 基本上,您需要从流中读取,直到您已经读取了所有数据,并且套接字已经关闭,或者直到您获得了“足够”的数据。如果你控制着协议,并且它是一个会话协议,那么如果你发送的每一条消息都以它的长度作为前缀,这会使生活变得更加容易——这意味着另一端知道会有多少数据。 |
![]() |
2
1
检查套接字的返回值。接收调用。它返回接收的字节数。您可以将此调用放入循环中并读取,直到获得预期的字节数为止。您还应该通过设置最大尝试次数来防止无限循环,或者按照约翰的建议,检查套接字的状态。另外,不要假设返回值为零意味着你已经阅读了整个消息。 如果您的协议中每个消息的前缀都是其长度,为了真正防弹,您的协议还应该定义一个标记字节来标记前缀长度头的结尾。一次读取一个字节,直到看到标记字节。然后计算消息的长度,并以更大的块读取,直到您全部读取为止。 receive定义了一个重载,该重载允许您指定要接收的字节数。(但是,您不能保证收到那么多,因此您仍然需要检查返回值。) |
![]() |
A B · C#Excel自动调整列避免长文本时出错 4 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 4 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 4 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 5 月前 |