c# - 确定 UDP 主机是否可达?

标签 c# windows-store-apps

我有一个 Metro 应用程序使用 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();
        }            

    }

最佳答案

UDP 套接字是“无连接”的,因此协议(protocol)不知道服务器和客户端是否已连接。要知道连接是否仍然“事件”,您必须实现自己的连接检测。

我可能会建议阅读 beej 的套接字指南。这是一本很好读的书,而且很有趣: http://beej.us/guide/bgnet/

关于c# - 确定 UDP 主机是否可达?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15276174/

相关文章:

c# - Microsoft.Composition (MEF2) 约定和开放泛型

c# - 使用 Linq 对列表中除最后一个元素之外的所有元素执行操作

c# - Windows 8 : How to undo & redo ink using built in Inking functionality?

c# - 获取 MusicLibrary 时 Windows Phone 8.1 应用商店应用程序出错(调用 COM 组件已返回错误 HRESULT E_FAIL)

c# - SQLite 加入嵌入式数据库表

c# - 嵌入的图像显示为损坏

C# - XmlIgnore 不适用于 override 或 new 修饰符

c# - 通过畸变矩阵从鼠标转换光线

c# - 如何在弹出对话框打开时禁用后台 GUI 交互

c# - VisualStateManager GoToState 不起作用