【发布时间】: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。我正在使用TcpClient 和UdpClient 创建套接字。
编辑: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 - 仍然是同样的错误。