12

C# では、UdpClient.Receive 関数を使用しています。

public void StartUdpListener(Object state)
    {
        try
        {
            udpServer = new UdpClient(new IPEndPoint(IPAddress.Broadcast, 1234));
        }
        catch (SocketException ex)
        {
            MessageBox.Show(ex.ErrorCode.ToString());
        }

        IPEndPoint remoteEndPoint = null;
        receivedNotification=udpServer.Receive(ref remoteEndPoint);
        ...

しかし、エラー コード 10049 でアドレスが利用できないというソケット例外が発生します。この例外を無効にするにはどうすればよいですか?

4

4 に答える 4

22

これは、私が現在動作する本番アプリで使用しているいくつかのコードの要点です (クライアントがサーバー アプリであり、スタンドアロン インストールで実行されている場合を処理するために、少し余分なものがあります)。メッセージを処理する準備ができたという udp 通知を受け取るのが仕事です。Adam Alexander が述べたように、唯一の問題は、IPAddress.Broadcast の代わりに IPAddress.Any を使用する必要があることです。ブロードキャスト UDP パケットを送信する場合にのみ、IPAddress.Broadcast を使用します。

UDP クライアントをセットアップする

this.broadcastAddress = new IPEndPoint(IPAddress.Any, 1234);
this.udpClient = new UdpClient();
this.udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
this.udpClient.ExclusiveAddressUse = false; // only if you want to send/receive on same machine.

また、コールバックを使用して非同期受信の開始をトリガーします。

this.udpClient.Client.Bind(this.broadcastAddress);
this.udpClient.BeginReceive(new AsyncCallback(this.ReceiveCallback), null);

これが役に立てば幸いです。あまり問題なく同期的に動作するように適応できるはずです。あなたがやっていることと非常に似ています。この後もエラーが発生する場合は、リッスンしようとしているポートを別の何かが使用している必要があります。

だから、明確にするために。

IPAddress.Any = 受信に使用されます。任意の IP アドレスに到着するパケットをリッスンしたい。IPAddress.Broadcast = 送信に使用されます。聞いている人にパケットを送信したい。

于 2009-04-17T08:53:18.947 に答える
5

あなたの目的のために、IPAddress.Broadcastの代わりにIPAddress.Anyを使用したいと思うでしょう。お役に立てれば!

于 2009-04-14T06:28:21.867 に答える
0

このエラーは、プロトコルが選択した IP/ポートの組み合わせにバインドできないことを意味します。

私は何年も UDP ブロードキャストを使用していませんが、別の IP 範囲を使用する必要があることを思い出します。

于 2009-04-14T06:30:17.243 に答える
0

UdpClient を構成した方法に問題はありません。別のポート番号を試しましたか? おそらく、1234 は別のアプリによってシステムで既に使用されています。

于 2009-04-14T06:31:22.123 に答える