0

Windows Phone 7.5 アプリケーションを開発しようとしており、ポート 8001 で UDP ブロードキャスト メッセージをリッスンするリスナー ソケットを作成したいと考えています。

「方法: Windows Phone 用の UDP ソケット クライアント アプリケーションを作成して使用する」の例を変更しましたが、「無効な引数例外」が発生していましたが、そのエラーを修正しました。

これは私のコードです:

    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 マルチキャストのみがサポートされています。

上記の 3 つのポイントが、コードの主な問題を要約していることを願っています。

于 2012-07-16T14:41:47.650 に答える