0

我正在尝试开发一个 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 上创建这种套接字?

4

1 回答 1

1

让我们按顺序进行:

  1. 上面的代码有效吗?您说您修复了“无效参数异常”问题,但我的猜测是它仍然无法按预期工作,原因如下
  2. 您不能在 Windows Phone 7 上的套接字上“侦听”,出于安全原因,您只能从您发起通信的 IP 接收,因此首先发送一个空数据包,然后侦听一段有限的时间。
  3. 不支持 UDP 广播,仅支持 TCP、UDP 单播和 UDP 多播。

我希望以上三点总结了您代码的主要问题。

于 2012-07-16T14:41:47.650 回答