如果我创建使用如何查找分配给UDP客户端(以.net/C#)的端口号?
var socket = new UdpClient(0,AddressFamily.InterNetwork);
我如何再找到插座端口的套接字?
我可能很笨拙,但我没有MSDN/Google的运气(可能是因为它在星期五的4:42而太阳正在闪亮)。
背景:
我想要做的就是找到一个开放的端口,然后到另一个进程报告将邮件转发到我在该端口上。可能有多个客户端,所以我不想使用固定端口。
谢谢。
如果我创建使用如何查找分配给UDP客户端(以.net/C#)的端口号?
var socket = new UdpClient(0,AddressFamily.InterNetwork);
我如何再找到插座端口的套接字?
我可能很笨拙,但我没有MSDN/Google的运气(可能是因为它在星期五的4:42而太阳正在闪亮)。
背景:
我想要做的就是找到一个开放的端口,然后到另一个进程报告将邮件转发到我在该端口上。可能有多个客户端,所以我不想使用固定端口。
谢谢。
UdpClient是Socket类的一个包装,它通过LocalEndPoint属性公开了它绑定的端点。由于您使用的是UDP/IP客户端这是一个IPEndPoint具有所需端口属性:
int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port;
对于那些(像我)谁需要使用原始套接字,这里是解决办法。
目标:
预期:(socket.LocalEndPoint为IPEndPoint).Port
问题
解决方案:
警告:
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;
}
感谢。星期一早上我会执行这个第一件事。我错过的是投到IPEndPoint,所以然后intellisense并没有帮助我。:( – Chasler 2009-08-22 00:04:12
该死的......从来没有想过...... thanx。:D – Cipi 2011-06-23 12:05:14
不幸的是,至少在.NET 4.0中,系统从不设置UDP套接字的端口字段,并且由于它是一个只读属性,你不能手动设置它 – 2014-09-25 18:57:22