如何找到分配给UDP客户端的端口号(在.net / C#中)?

时间:2009-08-21 23:45:10

标签: c# udp udpclient

如果我使用

创建套接字
var socket = new UdpClient(0,AddressFamily.InterNetwork);

如何找到套接字的端口?

我可能很愚蠢,但我在MSDN / Google上没有运气(可能是因为星期五凌晨4点42分,太阳正在闪耀)。

背景:

我想要做的是找到一个开放端口,然后向另一个进程报告,以便在该端口上将消息转发给我。可能有多个客户端,所以我不想使用固定端口。

感谢。

2 个答案:

答案 0 :(得分:14)

UdpClient是Socket类的包装器,它通过LocalEndPoint属性公开它绑定的端点。由于您使用的是UDP / IP客户端,因此它是一个具有所需端口属性的IPEndPoint:

int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port;

答案 1 :(得分:0)

对于那些需要使用RAW套接字的人(比如我),这是解决方法。

目标:

  1. 在任意端口上创建RAW UDP套接字
  2. 了解系统选择的端口。
  3. 预期:( socket.LocalEndPoint为IPEndPoint).Port

    问题

    • 而DGRAM UDP Socket知道其(socket.LocalEndPoint为IPEndPoint).Port
    • RAW UDP套接字始终返回零

    溶液:

    1. 创建一个普通的DGRAM UDP套接字
    2. 绑定该套接字
    3. 找出它的港口
    4. 关闭正常套接字
    5. 创建RAW UDP套接字
    6. CAVEAT:

      • 使用修改后的local IPEndPoint变量来了解端口,因为套接字将始终报告为零。

      代码:

      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;
      }