【问题标题】:Mutlcast UDP: Only one usage of each socket address (protocol/network address/port) is normally permitted多播 UDP:每个套接字地址(协议/网络地址/端口)通常只允许使用一次
【发布时间】:2023-03-24 13:16:01
【问题描述】:

我正在尝试使用 UDPClient 来侦听多播 IP(UDP 端口 3000)数据包。

当我确实运行了发送程序(它也侦听该端口)时,我在 UdpClient listener = ... 线上收到以下错误。

System.Net.Sockets.SocketException: 
 'Only one usage of each socket address (protocol/network address/port) is normally permitted'

但是,如果它没有运行,我不会收到该错误,但程序会锁定等待数据包到达。

程序全文为:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Vtunnel
{
    public class UDPListener
    {
        private const int listenPort = 3000;
        private const string multicastIP = "239.0.0.0";
        private const string myIP = "10.4.30.239";

        public static void StartListener() { 
            bool done = false;
            IPAddress listenAddress;
            IPAddress myAddress;

            IPAddress.TryParse(multicastIP, out listenAddress);
            UdpClient listener = new UdpClient(listenPort);
            IPEndPoint groupEP = new IPEndPoint(listenAddress, listenPort);

            try
            {
                while (!done)
                {
                    Console.WriteLine("Waiting for multicast");
                    byte[] bytes = listener.Receive(ref groupEP);

                    Console.WriteLine("Received multicast from {0} :\n {1}\n",
                        groupEP.ToString(),
                        Encoding.ASCII.GetString(bytes, 0, bytes.Length));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                listener.Close();
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            UDPListener.StartListener();
        }
    }
}

【问题讨论】:

    标签: .net sockets udpclient


    【解决方案1】:

    试试这个,你需要在绑定之前给套接字设置 SO_REUSEADDR 标志。

    Dim listener As New UdpClient()
    listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True)
    listener.Client.Bind(New IPEndPoint(IPAddress.Any, listenPort))
    listener.JoinMulticastGroup(listenAddress)
    

    来源:

    https://stackoverflow.com/a/577905/1486185

    http://www.jarloo.com/c-udp-multicasting-tutorial/

    【讨论】:

    • 这是一个DIS模拟,即- 类似游戏引擎的东西。它从对等引擎发送和接收多播数据包。我在这里编写的 c# 程序将利用数据包流并将副本发送到 vpn 地址。到目前为止,我一直只听数据包。
    • 我知道你可以在同一个节点上有两个对等引擎。他们可以在同一个端口上进行发送和接收。
    • 我已经重写了答案。我没有意识到多播部分。即使您的问题非常清楚:)
    • 非常感谢。是的。这很好用。现在我想将接收更新为异步,以便它可以发送
    猜你喜欢
    • 2019-05-03
    • 2017-06-09
    • 2011-01-15
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多