C#异步套接字BeginSend

时间:2010-01-03 19:10:49

标签: c# asynchronous sockets

我想了解以下信息:

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

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

如果message.lenght大于buffersize(32),我是否必须多次调用BeginSend来传输整个数据包?

或者我只是在另一端进行多次读取,直到收到实际缓冲区长度的结束?

这是在实际实施之前阅读文档的讨论。

感谢。

1 个答案:

答案 0 :(得分:4)

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

在上述情况下,只要实际邮件大小小于2147483648(2 ^ 31),您就可以在一次调用中将其发送给该方法。

在接收端,你有几个选择:

  1. 如果消息大小未知,您可以使用循环来按块读取它,直到一个Receive调用返回小于完整的块大小。
  2. 如果消息在前几个字节(即其标题)中包含其长度,则可以先读取标题,然后分配足够的缓冲区空间以在一次调用中读取整个消息。
  3. 如果邮件大小保证小于某个数字,您可以分配足够大的缓冲区,保证在一次通话中读取任何邮件。