UDP客户端分配可用端口太晚
本文关键字:客户端 分配 UDP | 更新日期: 2023-09-27 18:28:42
在C#,.Net 4中,我需要在一个端口上发送UDP消息,并在同一端口上侦听响应。
我使用的是一个固定端口,但一位客户遇到了问题,所以我想使用任何可用的端口。似乎我可以通过使用0作为端口号来做到这一点,但它不起作用。深入研究一下,它似乎在实际使用之前不会分配端口,所以我的两个绑定语句可能会去到不同的端口。
来自MSDN:
"如果您不关心使用哪个本地端口,您可以创建IPEndPoint使用0作为端口号。在这种情况下,服务提供商将分配一个介于1024和5000之间的可用端口号。如果你使用上面的方法,你可以发现什么本地网络地址和端口号已通过调用LocalEndPoint。。。如果您使用的是无连接协议在您完成发送或接收。"
问题是,我想在初始化时设置我的发送和接收。如果我等到第一次发送时才设置接收,我可能会错过一些响应。有没有比发送垃圾消息来分配端口以便完成初始化更好的答案?
我的代码:
public bool InitializeSockets()
{
try
{
IPAddress localaddr = LocalIPAddress();
localep = new IPEndPoint(localaddr, 0); //(was port 50000);
//-----------------------------------------------------------------
// set up listener port for responses coming back on the same port
//-----------------------------------------------------------------
listener = new UdpClient();
listener.ExclusiveAddressUse = false;
listener.Client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress, true);
listener.Client.Bind(localep);
detailsOutputText = "Ready to listen on " + localep;
ustate = new UdpState();
ustate.e = localep;
ustate.u = listener;
//------------------------
// set up broadcast port
//------------------------
bcast = new UdpClient();
bcast.Client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress, true);
bcast.Client.Bind(localep);
//-------------------------------
// start listening for responses
//-------------------------------
msgRxCallback = listener.BeginReceive(new AsyncCallback(DiscoveryCallback), ustate);
return true;
}
catch (Exception exc)
{
if (exc is SocketException)
{
// This only catches if another process has opened that port without sharing it
// or if firewall blocks it?
MessageBox.Show("Error opening IP address:Port : " + localep;
}
else
MessageBox.Show(exc.ToString());
return false;
}
}
感谢
两个选项:
- 创建一个包含端口号的配置文件。初始化时,读取配置文件,并在设置客户端时使用该端口号。提供一个带有默认端口号的配置文件,并在需要时向客户提供如何更改的说明
- 在初始化过程中,创建一个接收器,给它一个很短的接收超时,然后调用
Receive
。这将导致端口绑定。然后,您可以获得本地端点,并在创建发件人时使用该端点。请参阅我可以在C#中设置UdpClient的超时吗?关于设置接收超时