如何找到分配给 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 套接字

警告:

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

【讨论】:

以上是关于如何找到分配给 UDP 客户端(在 .net/C# 中)的端口号?的主要内容,如果未能解决你的问题,请参考以下文章

DHCP 动态主机配置协议   Dynamic Host Configuration Protocol

局域网自动分配IP

DHCP协议总结

在 Go 中写入客户端 UDP 套接字

magelinux(0111)

如何找到分配给redis实例的内存?