【问题标题】:WinRT UDP communication exception during reading读取期间 WinRT UDP 通信异常
【发布时间】:2013-01-13 12:44:45
【问题描述】:

我正在开发一个 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 让我抓狂...

感谢您的宝贵时间和帮助!

【问题讨论】:

  • 我讨厌成为坏消息的暴露者,所以只是评论。但是您在这里违反了沙盒限制。不允许进程相互通信。本地环回是一种典型的恶意软件技术。您可以仅出于测试目的暂时禁用它,但您无法通过商店获得它。抱歉,这势必会给你的计划造成一个巨大的漏洞。
  • 通信发生在两个设备之间。所以你的观点不应该适用于我的情况,但很高兴知道。

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


【解决方案1】:

您不应在从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);

【讨论】:

  • 如果这个答案已经解决了你的问题,请考虑接受它,以便其他阅读本文的人也将从这些知识中受益。
【解决方案2】:

实际上,尽管您随代码一起提供了正确答案,但上述代码不起作用。以下是如何让它发挥作用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2011-06-08
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多