如何找到分配给 UDP 客户端(在 .net/C# 中)的端口号?
Posted
技术标签:
【中文标题】如何找到分配给 UDP 客户端(在 .net/C# 中)的端口号?【英文标题】:How do I find the port number assigned to a UDP client (in .net/C#)? 【发布时间】:2010-11-21 19:53:50 【问题描述】:如果我使用
创建套接字var socket = new UdpClient(0,AddressFamily.InterNetwork);
然后我如何找到套接字的端口?
我可能很傻,但我在 MSDN/Google 中没有运气(可能是因为周五 4:42 并且阳光明媚)。
背景:
我想要做的是找到一个开放的端口,然后报告给另一个进程在该端口上将消息转发给我。可能有多个客户端,所以我不想使用固定端口。
谢谢。
【问题讨论】:
【参考方案1】:UdpClient 是 Socket 类的包装器,它通过 LocalEndPoint 属性公开它绑定到的端点。由于您使用的是 UDP/IP 客户端,因此它是一个具有所需端口属性的 IPEndPoint:
int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port;
【讨论】:
谢谢。我将在星期一早上实施第一件事。我缺少的是 IPEndPoint 的演员表,所以智能感知对我没有任何帮助。 :( 该死的......从来没有想过......thanx。 :D 遗憾的是,至少在 .NET 4.0 中,系统从不设置 UDP 套接字的端口字段。而且由于它是一个 get-only 属性,你也不能手动设置它。 哎呀。我应该说:绑定时系统没有在RAW UDP Sockets上设置端口。它适用于 DGRAM 套接字。【参考方案2】:对于那些(像我一样)需要使用 RAW 套接字的人,这里是解决方法。
目标:
-
在任意端口上创建 RAW UDP 套接字
了解系统选择的端口。
预期:(socket.LocalEndPoint as IPEndPoint).Port
问题
而 DGRAM UDP Socket 知道它的 (socket.LocalEndPoint as IPEndPoint).Port RAW UDP Socket 总是返回零解决方案:
-
创建一个普通的 DGRAM UDP 套接字
绑定该套接字
找出它的端口
关闭那个普通套接字
创建 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;
【讨论】:
以上是关于如何找到分配给 UDP 客户端(在 .net/C# 中)的端口号?的主要内容,如果未能解决你的问题,请参考以下文章