6

如果我使用创建套接字

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

那么我如何找到套接字的端口?

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

背景:

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

谢谢。

4

2 回答 2

16

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

int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port;
于 2009-08-21T23:57:41.113 回答
0

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

目标:

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

预期:(socket.LocalEndPoint 作为 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;
}
于 2014-09-25T20:42:52.403 回答