C# UWP TCP服务器内存溢出异常
我正在UWP中构建一个TCP服务器,从一个节点MCU(基于Arduino)接收和发送数据到一台windows PC(稍后它将是一个带有windows 10 IOT的Raspberry Pi) 在设置和启动服务器时,没有问题,而且NodeMCU正在将状态更改为“已连接”-看起来PC和NodeMCU之间的连接工作正常 当接收到数据时,我在事件处理程序中得到一个异常,因为包的大小(下面代码中的变量大小)被读取为“1414743380”,这太多了,所以我得到一个异常“内存不足,无法继续执行程序。”在“await reader.LoadAsync((uint)size);”行中,这似乎正好 变量payloadsize包含以下内容: 问题是为什么我会得到这样一个包大小,它是从哪里来的? NodeMCU/Arduino那边有什么问题吗 我使用了来自的TCP服务器的代码 正在启动服务器:C# UWP TCP服务器内存溢出异常,c#,tcp,uwp,C#,Tcp,Uwp,我正在UWP中构建一个TCP服务器,从一个节点MCU(基于Arduino)接收和发送数据到一台windows PC(稍后它将是一个带有windows 10 IOT的Raspberry Pi) 在设置和启动服务器时,没有问题,而且NodeMCU正在将状态更改为“已连接”-看起来PC和NodeMCU之间的连接工作正常 当接收到数据时,我在事件处理程序中得到一个异常,因为包的大小(下面代码中的变量大小)被读取为“1414743380”,这太多了,所以我得到一个异常“内存不足,无法继续执行程序。”在“a
public async Task<bool> StartListeningAsync()
{
if (_localSocket == null)
{
_localSocket = new StreamSocketListener();
_localSocket.ConnectionReceived += LocalSocketConnectionReceived;
await _localSocket.BindServiceNameAsync(CommunicationPort);
return true;
}
return false;
}
来自Arduino的信息如下(来自Wireshark):
编辑:完整消息描述
看起来Arduino没有在消息开头发送字节计数。TCP将有两个标题IP Header()和TCP Header()。是否有方法对此进行调试?如果我在Wireshark中查看消息,一切看起来都很好。我已在问题中添加了完整帧。如果我手动将大小设置为“2”,我可以接收命令“\r\n”或十六进制:13和10。如果我将大小设置为3-我会得到一个异常,即我正在访问wrtong内存。因此,字节大小似乎不正确。实际上,如果cou将变量payloadsize(如上图所示)转换为十六进制,它正好包含“TEST”——因此它包含数据段的前四个字节。我是否需要在前四个字节中手动发送数据包的长度?TCP套接字不提供有效负载大小。我要做的是发送前8个字节(长)中的有效负载大小,接收器将读取前8个字节,将其转换为长字节,然后开始读取剩余的有效负载。
private async void LocalSocketConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
using (var reader = new DataReader(args.Socket.InputStream))
{
reader.InputStreamOptions = InputStreamOptions.None;
// Read the length of the payload that will be received.
byte[] payloadSize = new byte[(uint)BitConverter.GetBytes(0).Length];
await reader.LoadAsync((uint)payloadSize.Length);
reader.ReadBytes(payloadSize);
// Read the payload.
int size = BitConverter.ToInt32(payloadSize, 0);
byte[] payload = new byte[size];
await reader.LoadAsync((uint)size);
reader.ReadBytes(payload);
}
}