Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP TCP服务器内存溢出异常_C#_Tcp_Uwp - Fatal编程技术网

C# UWP 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

我正在UWP中构建一个TCP服务器,从一个节点MCU(基于Arduino)接收和发送数据到一台windows PC(稍后它将是一个带有windows 10 IOT的Raspberry Pi)

在设置和启动服务器时,没有问题,而且NodeMCU正在将状态更改为“已连接”-看起来PC和NodeMCU之间的连接工作正常

当接收到数据时,我在事件处理程序中得到一个异常,因为包的大小(下面代码中的变量大小)被读取为“1414743380”,这太多了,所以我得到一个异常“内存不足,无法继续执行程序。”在“await reader.LoadAsync((uint)size);”行中,这似乎正好

变量payloadsize包含以下内容:

问题是为什么我会得到这样一个包大小,它是从哪里来的? NodeMCU/Arduino那边有什么问题吗

我使用了来自的TCP服务器的代码

正在启动服务器:

    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);
        }
    }