读取期间WinRT UDP通信异常

时间:2013-01-13 12:44:45

标签: c# udp windows-runtime windows-phone-8

我正在开发一个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接收MessageReceived事件,我得到DataReader和trz读取4 bztes。在调用它期间,我收到以下异常消息: “操作标识符无效。” (hresult -2147020579)

MessageReceived事件的代码:

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让我发疯了......

感谢您的时间和帮助!

2 个答案:

答案 0 :(得分:2)

您不应该致电LoadAsync来自DataReader电话的DatagramSocketMessageReceivedEventArgs.GetDataReader()UnconsumedBufferLength。似乎数据报已经加载到那里。如果您检查该阅读器的recvfrom,您会看到它包含数据报的完整大小。

实际上,这对UDP套接字有意义,因为在WinSock库中(我猜,它是WinRT套接字的底层实现),你总是在一次DataReader reader = args.GetDataReader(); reader.UnicodeEncoding = UnicodeEncoding.Utf8; uint messageSize = reader.ReadUInt32(); string message = reader.ReadString(messageSize); 调用中收到整个数据报(如果你提供的话)足够大的缓冲区,但我希望WinRT为我们处理这个问题)。不需要异步读取流 - 所有数据都已存在。

因此,请继续从该流中读取您的值。您的代码将转换为:

{{1}}

答案 1 :(得分:0)

实际上,虽然您提供了正确的答案以及代码,但上述代码不起作用。以下是您如何使用它:

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