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