2009-08-21 87 views
4

如果我创建使用如何查找分配给UDP客户端(以.net/C#)的端口号?

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

我如何再找到插座端口的套接字?

我可能很笨拙,但我没有MSDN/Google的运气(可能是因为它在星期五的4:42而太阳正在闪亮)。

背景:

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

谢谢。

回答

11

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

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

感谢。星期一早上我会执行这个第一件事。我错过的是投到IPEndPoint,所以然后intellisense并没有帮助我。:( – Chasler 2009-08-22 00:04:12

+0

该死的......从来没有想过...... thanx。:D – Cipi 2011-06-23 12:05:14

+0

不幸的是,至少在.NET 4.0中,系统从不设置UDP套接字的端口字段,并且由于它是一个只读属性,你不能手动设置它 – 2014-09-25 18:57:22

0

对于那些(像我)谁需要使用原始套接字,这里是解决办法。

目标:

  1. 创造上的任意端口
  2. 一个RAW UDP套接字系统学习选择哪个端口。

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

问题

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

解决方案:

  1. 创建一个普通DGRAM UDP套接字
  2. 绑定套接字
  3. 找出它的端口
  4. 接近正常插座
  5. 创建的RAW UDP套接字

警告:

  • U请修改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; 
}