【问题标题】:Message-size error when trying to receive a small UDP packet尝试接收小型 UDP 数据包时出现消息大小错误
【发布时间】:2018-03-22 07:42:32
【问题描述】:

当我调用Socket.ReceiveFrom 时,我得到以下异常:

System.Net.Sockets.SocketException:在数据报套接字上发送的消息大于内部消息缓冲区或其他网络限制,或者用于接收数据报的缓冲区小于数据报本身。

但是,我只发送了一个 118 字节的数据包。

代码很简单:

numBytesRead = udpSocket.ReceiveFrom(data, ref _udpRemoteEndPoint);

其中数据被分配到 1200 字节。

我做错了什么?

值得一提的是,我只有在 Windows 上运行时才会收到此错误 - 该代码在我的 Mac 上运行良好。

更多细节:我在 Unity(游戏引擎)中用 C# 代码编写。
我在每台机器上打开了一个TCP 套接字和一个UDP 套接字。我正在使用Select 循环在同一个线程中处理这两个,所以我只有在知道数据可用后才调用ReceiveFrom。我正在使用TcpClientUdpClient 创建套接字。

编辑:This question 不同,因为我不发送大数据包。我认为我的 118 字节有效负载不会溢出任何内部缓冲区。

【问题讨论】:

  • 问:“我只有在 Windows 上运行时才会收到此错误...” 答:那是因为它是 .Net System.Net.Sockets 库中的限制,而不是“套接字”本身。建议:声明一个更大的缓冲区,或者找到除 System.Net.Sockets 之外的其他网络库。另外:考虑使用ReceiveAsync 进行部分读取:stackoverflow.com/questions/21876089
  • @paulsm4 System.Net.Sockets 不能处理 118 字节数据包的想法是荒谬的。请注明你从哪里得到的。
  • 我从来没有说过它不能处理 118 字节的数据包。相反,我试图让 OP 专注于 .Net 库 - 以及他如何使用它 - 而不是一般的“Windows”或“套接字”。我的建议仍然存在。
  • 我试图扩大缓冲区并使用 ReceiveAsync - 仍然是同样的错误。

标签: c# windows unity3d udp


【解决方案1】:

您必须为缓冲区设置足够的空间: 字节[] 数据 = 新字节[1024];

调用也是这样进行的: udpSocket.EndReceiveFrom(ar, ref _udpRemoteEndPoint); 其中 ar 是 IAsyscResult 类型。

【讨论】:

  • 谢谢,数据确实分配好了。我使用了 ReceiveFrom,而不是 EndReceiveFrom。差别不大。
猜你喜欢
  • 2021-04-14
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2017-08-20
  • 2015-06-18
  • 2016-01-08
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多