Сокет уже используется для широковещательной передачи

Я хочу сделать консольное приложение для чата Broadcast на С#, создать задачу прослушивания и отправлять истинные сообщения. Но когда я попытался запустить второго пользователя, у меня возникла ошибка, что сокет уже использует порт. Как это исправить? а что я не правильно делаю? Ошибка снимка экрана – › Ошибка

private static int localPort = 15000;
private static string nickName;
private static string msg;
private static string datasend;
private static string fullmsg;

[STAThread]
static void Main(string[] args)
{
    try
    {
        Console.WriteLine("Enter your Nickname:");
        nickName = Console.ReadLine();
        Thread tRec = new Thread(new ThreadStart(Receiver));
        tRec.Start();
        while (true)
        {
            msg = Console.ReadLine();
            datasend = DateTime.Now.ToString();
            fullmsg = datasend + ":" + nickName + "-" + msg;
            Send(fullmsg);
        }
    }
}

private static void Send(string datagram)
{
    UdpClient sender = new UdpClient();
    sender.EnableBroadcast = true;
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, localPort);
    try
    {
        byte[] bytes = Encoding.UTF8.GetBytes(datagram);
        sender.Send(bytes, bytes.Length, endPoint);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception: " + ex.ToString() + "\n  " + ex.Message);
    }
    finally
    {
        sender.Close();
    }
}

public static void Receiver()
{
    UdpClient receivingUdpClient = new UdpClient(localPort);
    receivingUdpClient.EnableBroadcast = true;
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, localPort);
    try
    {
        Console.WriteLine("\n-----------*******Chat*******-----------");
        while (true)
        {
            byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
            string returnData = Encoding.UTF8.GetString(receiveBytes);
            Console.WriteLine(" --> " + returnData.ToString());
        }
}

person Destroyer    schedule 14.03.2021    source источник
comment
Вы должны использовать только один сокет для отправки и получения. У вас может быть только один сокет с одинаковым IP-адресом источника, IP-адресом назначения и номером порта. Вы используете одни и те же три параметра для сокета отправки и получения, вызывая дублирование и создавая ошибку.   -  person jdweng    schedule 14.03.2021
comment
@jdweng и как это сделать?   -  person Destroyer    schedule 14.03.2021
comment
См. пример msdn: документы. microsoft.com/en-us/dotnet/api/. Вам может потребоваться зарегистрироваться в группе, если порт используется другим приложением.   -  person jdweng    schedule 14.03.2021
comment
Это правда, что сокеты являются двунаправленными/полнодуплексными, но, похоже, это не та проблема, о которой вы спрашиваете. Скорее у вас возникла проблема с запуском более одного экземпляра процесса на одном ПК. Это связано с тем, что локальный порт UDP уже используется, когда вы запускаете второй процесс. Вы не должны пытаться это сделать; только один процесс на данном сетевом адаптере должен прослушивать/принимать данные на данном порту. Ваш второй процесс должен перехватывать IOException и не пытаться прослушивать трансляции. Если вы действительно хотите, чтобы два или более процессов на одном компьютере получали одно и то же...   -  person Peter Duniho    schedule 14.03.2021
comment
... дейтаграммы, вы должны использовать UDP многоадресную рассылку, которая является родственной, но другой техникой. Каждый процесс присоединится к одной многоадресной группе (каналу) и сможет получать дейтаграммы, используя одну и ту же группу. Вы можете использовать SO_REUSEADDR, чтобы процессы совместно использовали широковещательный порт локально, но это, вероятно, вызовет гораздо более серьезные проблемы, чем те, которые у вас есть сейчас. Я настоятельно рекомендую против этого. Смотрите дубликат для более подробной информации.   -  person Peter Duniho    schedule 14.03.2021