【问题标题】:How do I find the port number assigned to a UDP client (in .net/C#)?如何找到分配给 UDP 客户端(在 .net/C# 中)的端口号?
【发布时间】:2010-11-21 19:53:50
【问题描述】:

如果我使用

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

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

我可能很傻,但我在 MSDN/Google 中没有运气(可能是因为周五 4:42 并且阳光明媚)。

背景:

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

谢谢。

【问题讨论】:

    标签: c# udp udpclient


    【解决方案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 套接字的人,这里是解决方法。

    目标:

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

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

    问题

    • 而 DGRAM UDP Socket 知道它的 (socket.LocalEndPoint as IPEndPoint).Port
    • RAW UDP Socket 总是返回零

    解决方案:

    1. 创建一个普通的 DGRAM UDP 套接字
    2. 绑定该套接字
    3. 找出它的端口
    4. 关闭那个普通套接字
    5. 创建 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多