3

デスクトップ アプリに接続する Win RT アプリを作成しており、UDP と TCP で通信を開始します。

Win RT からデスクトップに送信し、デスクトップから Win RT に送信できるという点で、TCP 通信を正常に実装しました。Win RT で StreamSocket を使用し、デスクトップで TcpListener を使用します。

また、Win RT からデスクトップに Udp データを問題なく送信することもできました。しかし、デスクトップから Win RT に送信されたデータを受信できません。次のコードを使用していますが、問題はありませんが、何か問題があるはずです。

    var g = new DatagramSocket();
    g.MessageReceived += g_MessageReceived;
    g.BindEndpointAsync(new HostName("127.0.0.1"), "6700");
    .
    .
    .
    void g_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    { // <- break point here.

    }

そのブレークポイントはコードを停止することはありません。つまり、メッセージを受け取ることはありません。StreamSocket では、reader.GetBytes() ではなく、reader.GetBuffers() でバイトを取得する必要があるため、IBuffer しか考えられません。ただし、それはデスクトップではなく Win RT で考える必要があることです。Tcpではバイトを送信するだけで、Win RTでバッファを取得するため、DatagramSocketでも同じことが起こるはずです。

  • リーダー = データリーダー

君たちありがとう。

4

1 に答える 1

5

私は新しい DatagramSocket クラスに詳しくありませんが、通常、127.0.0.1 にバインドすると、ループバック アダプターに送信されたメッセージのみを受信することになります。パケットは別のホストから送信されているため、ループバック アダプターではなく NIC で受信する必要があります。

編集BindServiceNameAsync():使用している DatagramSocket API のドキュメントを見ると、すべてのアダプターで指定されたポートにバインドする代わりにメソッドを使用できます。BindEndpointAsync()これは、私の System.Net.Sockets API と同じ動作です。以下の例。したがって、あなたの例では、次のようになります。

g.BindServiceNameAsync("6700");

もちろん、デスクトップ ホストのファイアウォール設定で、指定したポートで着信 UDP パケットをリッスンできるようにする必要もあります。

次のコードを試してください。

    using System.Net;
    using System.Net.Sockets;

    public class UdpState
    {
        public UdpClient client;
        public IPEndPoint ep;
    }

    ...

    private void btnStartListener_Click(object sender, EventArgs e)
    {
        UdpState state = new UdpState();
        //This specifies that the UdpClient should listen on EVERY adapter
        //on the specified port, not just on one adapter.
        state.ep = new IPEndPoint(IPAddress.Any, 31337);
        //This will call bind() using the above IP endpoint information. 
        state.client = new UdpClient(state.ep);
        //This starts waiting for an incoming datagram and returns immediately.
        state.client.BeginReceive(new AsyncCallback(bytesReceived), state);
    }

    private void bytesReceived(IAsyncResult async)
    {
        UdpState state = async.AsyncState as UdpState;
        if (state != null)
        {
            IPEndPoint ep = state.ep;
            string msg = ASCIIEncoding.ASCII.GetString(state.client.EndReceive(async, ref ep));
            //either close the client or call BeginReceive to wait for next datagram here.
        }
    }

上記のコードでは、文字列を送信する際に使用するエンコーディングを明らかに使用する必要があることに注意してください。そのテスト アプリを作成したとき、文字列を ASCII で送信しました。Unicode で送信する場合は、UnicodeEncoding.Unicode代わりにASCIIEncoding.ASCII.

これでうまくいかない場合は、Wireshark などのパケット キャプチャ ユーティリティを使用して、RT ホストからの UDP パケットが実際にデスクトップ ホストに到達していることを確認することをお勧めします。

于 2012-12-11T05:53:08.963 に答える