正在使用的多播侦听器端口
Multicast listener port in use
我是多播编程的新手。到目前为止,我可以成功地从两个独立的进程(发送方和接收方)发送和接收多播消息。我的问题是接收器...
接收者代码:
private static void ReceiveMulticastMessages()
{
var groupEndPoint = new IPEndPoint(IPAddress.Parse("238.8.8.8"), 23888);
var localEndPoint = new IPEndPoint(IPAddress.Any, 23888);
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localEndPoint);
udpClient.JoinMulticastGroup(groupEndPoint.Address, localEndPoint.Address);
while (true)
{
var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
var bytes = udpClient.Receive(ref remoteEndPoint);
var message = Encoding.ASCII.GetString(bytes);
Console.WriteLine(message);
}
}
}
只要我为 localEndPoint
指定端口 23888
,上面的代码就可以工作。如果我更改本地端口号,则不会收到任何消息。我更愿意将其设置为 0
以便 OS 可以选择端口。为什么我不能指定与多播组不同的本地端口?
假设本地端点端口必须匹配多播组端口,客户端如何处理本地端口冲突?
另一方面,应用程序(多播发送方)如何选择多播组端口以使任何订阅者都不会发生端口冲突?
发送任何 UDP 消息(不仅仅是多播消息)时,发送方发送到 的端口必须 与接收方正在侦听的端口匹配。这就是消息到达正确位置的方式。如果消息发送到接收者绑定的端口以外的端口,接收者将不会收到它。
因此需要定义一个端口号,接收方将监听该端口号,服务器将发送到该端口号。
我是多播编程的新手。到目前为止,我可以成功地从两个独立的进程(发送方和接收方)发送和接收多播消息。我的问题是接收器...
接收者代码:
private static void ReceiveMulticastMessages()
{
var groupEndPoint = new IPEndPoint(IPAddress.Parse("238.8.8.8"), 23888);
var localEndPoint = new IPEndPoint(IPAddress.Any, 23888);
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localEndPoint);
udpClient.JoinMulticastGroup(groupEndPoint.Address, localEndPoint.Address);
while (true)
{
var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
var bytes = udpClient.Receive(ref remoteEndPoint);
var message = Encoding.ASCII.GetString(bytes);
Console.WriteLine(message);
}
}
}
只要我为 localEndPoint
指定端口 23888
,上面的代码就可以工作。如果我更改本地端口号,则不会收到任何消息。我更愿意将其设置为 0
以便 OS 可以选择端口。为什么我不能指定与多播组不同的本地端口?
假设本地端点端口必须匹配多播组端口,客户端如何处理本地端口冲突?
另一方面,应用程序(多播发送方)如何选择多播组端口以使任何订阅者都不会发生端口冲突?
发送任何 UDP 消息(不仅仅是多播消息)时,发送方发送到 的端口必须 与接收方正在侦听的端口匹配。这就是消息到达正确位置的方式。如果消息发送到接收者绑定的端口以外的端口,接收者将不会收到它。
因此需要定义一个端口号,接收方将监听该端口号,服务器将发送到该端口号。