我想要以下信息:

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来传输整个数据包?

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

这是一个讨论,因为我会在实际实现之前先阅读文档。

谢谢。

最佳答案

缓冲区大小不是32,而是所定义的message.Length。您可能将Int32与值32混淆了。

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

在接收端,您有几种选择:

  • 如果消息大小未知,则可以使用循环逐块读取消息,直到一个Receive调用返回的大小小于完整块的大小为止。
  • 如果邮件的长度在前几个字节(即邮件头)中包含,那么您可以先读取邮件头,然后分配足够的缓冲区空间以在一个调用中读取整个邮件。
  • 如果保证邮件大小小于特定数目,则可以分配足够大的缓冲区,以保证可以在一个调用中读取任何消息。
  • 关于c# - C#异步套接字BeginSend,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1995929/

    10-13 07:51