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

如果我使用创建套接字

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

然后我如何找到套接字的端口?

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

背景:

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

谢谢。

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

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

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

目标:

  1. 在任意端口上创建RAW UDP套接字
  2. 了解系统选择的端口。

预期:(socket.LocalEndPoint as IPEndPoint).Port

问题

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

解:

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

警告:

  • 使用修改后的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; }