如何找到分配给UDP客户端的端口号(在.net / C#中)?
如果我使用创建套接字
var socket = new UdpClient(0,AddressFamily.InterNetwork);
然后我如何找到套接字的端口?
我可能很愚蠢,但我在MSDN / Google上没有运气(可能是因为星期五凌晨4点42分,太阳正在闪耀)。
背景:
我想要做的是找到一个开放的端口,然后向另一个进程报告,以便在该端口上向我转发消息。 可能有多个客户端,所以我不想使用固定端口。
谢谢。
UdpClient是Socket类的包装器,它通过LocalEndPoint属性公开它绑定的端点。 由于您使用的是UDP / IP客户端,因此它是一个具有所需Port属性的IPEndPoint:
int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port;
对于那些需要使用RAW套接字的人(比如我),这是解决方法。
目标:
- 在任意端口上创建RAW UDP套接字
- 了解系统选择的端口。
预期:(socket.LocalEndPoint as IPEndPoint).Port
问题
- 而DGRAM UDP Socket知道它(socket.LocalEndPoint为IPEndPoint).Port
- RAW UDP套接字始终返回零
解:
- 创建一个普通的DGRAM UDP套接字
- 绑定该套接字
- 找出它的港口
- 关闭那个正常的sockets
- 创建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; }