2010-01-03 265 views
1

我想在以下一些信息:C#异步套接字BeginSend

Socket.BeginSend Method (array<Byte>[]()[], Int32, Int32, SocketFlags, AsyncCallback, Object) 

client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client); 

如果message.lenght大于缓冲区大小(32)我一定要调用BeginSend多次传输整个数据包更大?

或者我只是在另一端做多个读取,直到收到实际缓冲区长度的结尾?

这是一个讨论,即时阅读实际执行前的文件。

谢谢。

回答

4

缓冲区大小不是32,它正好是定义的message.Length。您可能会将Int32与值32混淆。

在上述情况下,只要实际消息大小小于2147483648(2^31),您可以通过一次调用将该消息发送给该方法。

在接收端可以有几种选择:

  1. 如果邮件的大小是不知道,你可以使用一个循环由大块阅读块,直到一个Receive调用返回不到一个完整的块大小。
  2. 如果消息在前几个字节(即其头部)中包含其长度,则可以先读取头部,然后分配足够的缓冲空间以在一次调用中读取整个消息。
  3. 如果消息大小保证小于某个数字,则可以分配足够大的缓冲区,以保证在一次调用中读取任何消息。
+0

即时通讯只是好奇,但为什么没有类似的接收结束?一种方法是一次取得真正的data.length数据包,而不是多次读取缓冲区长度(32个),以获得完整的数据?希望我明白原因,我对此感到新奇。谢谢。 – iTEgg 2010-01-03 19:19:37

+0

我将编辑我的答案以解决... – 2010-01-03 19:20:38

+0

谢谢。你一直很有帮助。 – iTEgg 2010-01-03 19:25:39