6

を使用してソケットを作成する場合

var socket = new UdpClient(0,AddressFamily.InterNetwork);

次に、ソケットのポートを見つけるにはどうすればよいですか?

私はおそらく気が狂っていますが、MSDN / Googleでは運がありません(おそらく金曜日の4:42で、太陽が輝いているためです)。

バックグラウンド:

私がやりたいのは、開いているポートを見つけてから、別のプロセスに報告して、そのポートでメッセージを転送することです。複数のクライアントが存在する可能性があるため、固定ポートは使用しません。

ありがとう。

4

2 に答える 2

16

UdpClientは、LocalEndPointプロパティを介してバインドされているエンドポイントを公開するSocketクラスのラッパーです。UDP / IPクライアントを使用しているので、それは目的のポートプロパティを持つIPEndPointです。

int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port;
于 2009-08-21T23:57:41.113 に答える
0

RAWソケットを使用する必要がある(私のような)人のために、ここに回避策があります。

ゴール:

  1. 任意のポートにRAWUDPソケットを作成するには
  2. システムが選択したポートを確認します。

期待される:(IPEndPointとしてのsocket.LocalEndPoint).Port

問題

  • 一方、DGRAM UDPソケットは、その(socket.LocalEndPoint as IPEndPoint).Portを認識しています。
  • RAWUDPソケットは常にゼロを返します

解決:

  1. 通常のDGRAMUDPソケットを作成します
  2. そのソケットをバインドします
  3. その港を見つける
  4. その通常のソケットを閉じます
  5. RAWUDPソケットを作成します

警告:

  • ソケットは常にゼロを報告するため、変更されたlocalIPEndPoint変数を使用してポートを確認します。

コード:

public Socket CreateBoundRawUdpSocket(ref IPEndPoint local)
{
    if (0 == local.port)
    {
        Socket wasted = new Socket(local.AddressFamily,
                                   SocketType.Dgram,
                                   ProtocolType.Udp);
        wasted.Bind(local);
        local.Port = (wasted.LocalEndPoint as IPEndPoint).Port;
        wasted.Close();
    }
    Socket goal = new Socket(local.AddressFamily,
                             SocketType.Raw,
                             ProtocolType.Udp);
    goal.Bind(local);
    return goal;
}
于 2014-09-25T20:42:52.403 に答える