如何在Windows Phone上创建UDP广播侦听器套接字

时间:2012-07-14 18:32:50

标签: c# windows-phone-7 sockets udp

我正在尝试开发Windows Phone 7.5应用程序,我想创建一个侦听器套接字来侦听端口8001上的UDP广播消息。

我修改了示例How to: Create and Use a UDP Socket Client Application for Windows Phone,但我收到了“无效的参数异常”,但我修复了该错误。

这是我现在的代码:

    public String SecureRecive(int portNumber, bool isBroadcast)
    {
        SocketAsyncEventArgs socketEventArg;

        Send("melnibone", portNumber, " ", isBroadcast, out socketEventArg);
        Thread.Sleep(1000);

        if (!isHasSent) ;
        return Receive(portNumber, isBroadcast, socketEventArg);
    }

    private string Send(string serverName, int portNumber, string data, bool isBroadcast, out SocketAsyncEventArgs socketEventArg)
    {
        string response = "Operation Timeout";

        // We are re-using the _socket object that was initialized in the Connect method
        if (_socket != null)
        {
            socketEventArg = new SocketAsyncEventArgs();
            // Set properties on context object
            if (isBroadcast)
                socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Broadcast, portNumber);
            else
                socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName, portNumber);

            // Inline event handler for the Completed event.
            // Note: This event handler was implemented inline in order to make this method self-contained.
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                response = e.SocketError.ToString();

                // Unblock the UI thread
                _clientDone.Set();
                isHasSent = true;
            });
            // Add the data to be sent into the buffer
            byte[] payload = Encoding.UTF8.GetBytes(data);
            socketEventArg.SetBuffer(payload, 0, payload.Length);

            // Sets the state of the event to nonsignaled, causing threads to block
            _clientDone.Reset();

            // Make an asynchronous Send request over the socket
            _socket.SendToAsync(socketEventArg);

            // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
            // If no response comes back within this time then proceed
            //_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            socketEventArg = null;
            response = "Socket is not initialized";
        }

        return response;
    }

    /// <summary>
    /// Receive data from the server
    /// </summary>
    /// <param name="portNumber">The port on which to receive data</param>
    /// <returns>The data received from the server</returns>
    private string Receive(int portNumber, bool isBroadcast, SocketAsyncEventArgs socketEventArg)
    {
        string response = "Operation Timeout";

        // We are receiving over an established socket connection
        if (_socket != null)
        {
            if (isBroadcast)
                socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Broadcast, portNumber);
            else
                socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber);

            // Setup the buffer to receive the data
            socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

            // Inline event handler for the Completed event.
            // Note: This even handler was implemented inline in order to make this method self-contained.
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                    // Retrieve the data from the buffer
                    response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                    response = response.Trim('\0');
                }
                else
                {
                    response = e.SocketError.ToString();
                }

                _clientDone.Set();
            });
            // Sets the state of the event to nonsignaled, causing threads to block
            _clientDone.Reset();

            // Make an asynchronous Receive request over the socket
            _socket.ReceiveFromAsync(socketEventArg);

            // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
            // If no response comes back within this time then proceed
            //_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            response = "Socket is not initialized";
        }

        return response;
    }

但我不知道如何将套接字超时设置为无限。

是否可以在Windows Phone上创建这种套接字?

1 个答案:

答案 0 :(得分:1)

让我们按顺序进行:

  1. 以上代码是否有效?你说你修复了“无效的参数异常”问题然而我的猜测是它仍然没有按预期工作,这是由于下一点的原因
  2. 您不能在Windows Phone 7上的套接字上“监听”,出于安全原因,您只能从发起通信的IP接收,因此首先发送一个空数据包然后监听有限的时间。
  3. 不支持UDP广播,仅支持TCP,UDP单播和UDP组播。
  4. 我希望以上三点总结了您的代码的主要问题。