2

UDP経由で接続されたアプリにデータを転送する必要があるWP8プロジェクトに取り組んでいます(WP8も)。Windows 8 とコードを共有できるように、DatagramSocket を使用することにしました。

サーバーとクライアント アプリは相互に接続できます。クライアントがサーバーに接続した後、それに応じてサーバーに応答するコマンドを送信します。クライアント接続とコマンド送信コードは次のようになります。

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、Bluetooth、およびNFCを実行しましたが、すべてが機能しており、同様のコードがあります。しかし、UDPは私を夢中にさせます...

お時間をいただきありがとうございます。

4

2 に答える 2

2

LoadAsync呼び出しからDataReader返された を呼び出さないでくださいDatagramSocketMessageReceivedEventArgs.GetDataReader()。そこにはすでにデータグラムがロードされているようです。そのリーダーをチェックするUnconsumedBufferLengthと、データグラムのフルサイズが含まれていることがわかります。

実際、これは UDP ソケットにとって理にかなっています。なぜなら、WinSock ライブラリ (おそらく、WinRT ソケットの基盤となる実装) では、1 回のrecvfrom呼び出しで常にデータグラム全体を受け取るからです (十分な大きさのバッファを提供していれば、 WinRT がこれを処理してくれることを願っています)。ストリームを非同期に読み取る必要はありません。すべてのデータは既にそこにあります。

したがって、そのストリームから値を読み取ってください。コードは次のように変換されます。

DataReader reader = args.GetDataReader();
reader.UnicodeEncoding = UnicodeEncoding.Utf8;
uint messageSize = reader.ReadUInt32();
string message = reader.ReadString(messageSize);
于 2013-04-18T19:32:22.843 に答える
0

実際、コードとともに正しい答えを提供したにもかかわらず、上記のコードは機能しません。これを機能させる方法は次のとおりです。

var reader = args.GetDataReader();
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
var size = reader.UnconsumedBufferLength;
var message = reader.ReadString(size);
于 2013-08-04T09:47:45.843 に答える