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;
        }
    }

感谢

UDP客户端分配可用端口太晚

两个选项:

  1. 创建一个包含端口号的配置文件。初始化时,读取配置文件,并在设置客户端时使用该端口号。提供一个带有默认端口号的配置文件,并在需要时向客户提供如何更改的说明
  2. 在初始化过程中,创建一个接收器,给它一个很短的接收超时,然后调用Receive。这将导致端口绑定。然后,您可以获得本地端点,并在创建发件人时使用该端点。请参阅我可以在C#中设置UdpClient的超时吗?关于设置接收超时