读取时WinRT UDP通信异常

本文关键字:通信 异常 UDP WinRT 读取 | 更新日期: 2023-09-27 17:52:33

我正在研究一个WP8项目,该项目应该通过UDP将数据传输到连接的应用程序(WP8也)。我决定使用DatagramSocket来与Windows 8共享代码。

服务器端和客户端可以相互连接。在客户端连接到服务器后,它发送一个命令,该命令应该相应地响应服务器。客户端连接和命令发送代码如下:

var stream = await _udpSocket.GetOutputStreamAsync(server, UdpCommunication.Port);
var writer = new DataWriter(stream);
writer.UnicodeEncoding = UnicodeEncoding.Utf8;
uint messageSize = writer.MeasureString(UdpCommunication.ReceiveImageCommand);
writer.WriteUInt32(messageSize);
await writer.StoreAsync();
writer.WriteString(UdpCommunication.ReceiveImageCommand);
await writer.StoreAsync();
await writer.FlushAsync();

所以我将传递消息大小,然后是字符串命令名称。到目前为止一切顺利。

服务器从DatagramSocket接收到messagerreceived事件,我让DataReader和trz读取4个字节。在调用这个过程中,我得到以下异常消息:"操作标识符无效。"(hresult -2147020579)

messagerreceived事件代码:

DataReader reader = args.GetDataReader();
reader.UnicodeEncoding = UnicodeEncoding.Utf8;
await reader.LoadAsync(4);
uint messageSize = reader.ReadUInt32();
await reader.LoadAsync(messageSize);
string message = reader.ReadString(messageSize);

有没有人知道为什么会抛出这个异常以及如何修复它?我已经做了TCP,蓝牙和NFC,所有的工作和类似的代码。但是UDP让我抓狂…

感谢您的时间和帮助!

读取时WinRT UDP通信异常

您不应该在DatagramSocketMessageReceivedEventArgs.GetDataReader()调用返回的DataReader上调用LoadAsync。看起来数据报已经在那里加载了。如果您检查该读取器的UnconsumedBufferLength,您将看到它包含您的数据报的完整大小。

实际上,这对UDP套接字有意义,因为在WinSock库(其中,我猜,是WinRT套接字的底层实现)中,您总是在一个recvfrom调用中接收整个数据报(如果您为它提供了足够大的缓冲区,但我希望WinRT为我们处理这个)。没有必要异步读取流——所有的数据都已经在那里了。

因此,只需继续从该流中读取值。你的代码会翻译成这样:

DataReader reader = args.GetDataReader();
reader.UnicodeEncoding = UnicodeEncoding.Utf8;
uint messageSize = reader.ReadUInt32();
string message = reader.ReadString(messageSize);

实际上,上面的代码不起作用,尽管您提供了正确的答案和代码。下面是让它工作的方法:

var reader = args.GetDataReader();
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
var size = reader.UnconsumedBufferLength;
var message = reader.ReadString(size);