ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-将多个侦听器绑定到同一端口

2019-11-21 23:08:03  阅读:443  来源: 互联网

标签:udpclient c


我在.net 3.5中使用UdpClient类
我需要将多个应用程序绑定到同一端口.

因此,如果UDP服务器广播任何请求-在该端口上侦听的所有应用程序都可以接收到该消息,但是问题是,当我尝试将一个应用程序绑定到同一端口时,只有一个应用程序接收到该消息,而另一个应用程序则没有.

下面是这两个应用程序的一些示例代码:

    UdpClient udpClient = new UdpClient();
    Thread thread;
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 11000);
    public Form1()
    {
        //CheckForIllegalCrossThreadCalls = false;

        InitializeComponent();
        udpClient.ExclusiveAddressUse = false;
        udpClient.Client.SetSocketOption(
        SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpClient.Client.Bind(endPoint);
    }

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            thread.Abort();
            udpClient.Close();
            Close();
        }
    }

    private void ReceiveMessage()
    {
        //while (true)
        //{
        // IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 11000);
        //  byte[] content = udpClient.Receive(ref endPoint);
        udpClient.BeginReceive(new AsyncCallback(Read_Callback), null);

        //if (content.Length > 0)
        //{
        //    string message = Encoding.ASCII.GetString(content);

        //    this.Invoke(myDelegate, new object[] { message });
        //}
        // }
    }

    public void Read_Callback(IAsyncResult ar)
    {
        try
        {
            byte[] buffer = udpClient.EndReceive(ar, ref endPoint);
            // Process buffer
            string s = Encoding.ASCII.GetString(buffer);
            // richTextBox1.Text = s;
            udpClient.BeginReceive(new AsyncCallback(Read_Callback), null);

        }
        catch (Exception ex)
        { }
    }

PS:我无法弄清楚原因,或者我缺少什么. ?

解决方法:

这就是套接字的本质.即使在多个应用程序可以访问同一端口的情况下(例如UDP),也将以先到先得的方式分发数据. UDP还以最小的开销进行设计,因此甚至没有机会(假设)像使用TCP一样“检查队列”.

它的设计是让多个进程共享服务器负载,并根据谁的空闲来交替接收谁的请求.

您需要构建一些外部组件来解决此问题,例如重传协议或数据库,以确保共享每个入站消息.

如果您可以处理这些更改,则更智能的处理方式是UDP Multicast,该方法实际上是多个程序注册来接收组消息.在这种情况下,可以(并且应该)放弃单端口限制.

标签:udpclient,c
来源: https://codeday.me/bug/20191121/2055349.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有