gpt4 book ai didi

c# - 将多个监听器绑定(bind)到同一个端口

转载 作者:太空狗 更新时间:2023-10-30 01:36:14 24 4
gpt4 key购买 nike

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

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

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

    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 那样。

它的设计围绕让多个进程分担服务器负载,根据谁的空闲轮流接收请求。

您需要构建一些外部的东西来解决这个问题,例如重传协议(protocol)或数据库以确保共享每个入站消息。

如果您可以应对这些变化,那么处理这种情况的更聪明的方法是 UDP 多播,其中多个程序基本上注册以接收组消息。在这种情况下,可以(也应该)放弃单端口限制。

关于c# - 将多个监听器绑定(bind)到同一个端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22810511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com