1

UDPを使用してwifi経由でデバイスと通信するメトロアプリがあります。ただし、デバイスをネットワークから切断したり、デバイスを切断した状態でアプリを起動したりしても、何も起こりません。ConnectAsyncは例外をスローしません。アプリは例外をスローしません。アプリは、何も問題がないように実行されます。もう一方の端にpingを実行することはできませんが、フォーマットされた文字列を指定すると応答します。デバイスは現在インターネットにアクセスできるルーターに接続されていますが、最終的にはインターネットにアクセスできないルーターを使用する予定です。私はUDPで何もしたことがないので、ここで途方に暮れています。

これはUDPリスナー/ライターの実装です(10rem.netのPete Brightから取得)

class Network
    {
        private DatagramSocket _socket;
        public bool IsConnected { get; set; }
        public bool recieved;
        public string ret;


        public Network()
        {
            IsConnected = false;

            _socket = new DatagramSocket();

            _socket.MessageReceived += OnSocketMessageReceived;
        }

        public async void Connect(HostName remoteHostName, string remoteServiceNameOrPort)
        {
            try
            {
              await  _socket.ConnectAsync(remoteHostName, remoteServiceNameOrPort);
            }
            catch (Exception e)
            {
                    var msg = new MessageDialog(e.ToString());
                    msg.ShowAsync();
            }
            IsConnected = true;
        }



        private void OnSocketMessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
        {
              var reader = args.GetDataReader();

                var count = reader.UnconsumedBufferLength;

                var data = reader.ReadString(count);

                ret = data.Trim();

                recieved = true;

        }


        DataWriter _writer =null;
        public async void SendMessage(string message)
        {
            if (String.IsNullOrEmpty(message)) return;
            if (_writer == null)
            {
                var stream = _socket.OutputStream;
                _writer = new DataWriter(stream);
            }

            _writer.WriteString(message);

            await _writer.StoreAsync();
        }            

    }
4

3 に答える 3

2

UDP ソケットは「コネクションレス」であるため、プロトコルはサーバーとクライアントが接続されているかどうかについて何も知りません。接続がまだ「アクティブ」かどうかを知るには、独自の接続検出を実装する必要があります。

beej のソケットに関するガイドを読むことをお勧めします。読みやすく、かなり面白いです: http://beej.us/guide/bgnet/

于 2013-03-07T16:22:02.910 に答える
0

これに出くわした人々を助けるために:どうやら私のgoogle-fuはかなり弱いようです。これは、TCP および UDP ソケットのタイムアウトを設定する方法を示しています。デフォルトの動作はタイムアウトしないことです(これは私が見たものと一致しています)。

編集:うまくいきません。500 ミリ秒のタイムアウトがあっても、「例外がスローされない」という同じ動作が引き続き表示されます。

于 2013-03-08T19:10:47.933 に答える