Система UDP-вещания не будет общаться на отдельных компьютерах - PullRequest
1 голос
/ 24 февраля 2012

Я работаю над широковещательным маяком в C #, который должен транслировать информацию сервера на все прослушивающие устройства.Отправленная информация будет содержать такую ​​информацию, как URL-адрес службы WCF, пространство имен, список необходимых аргументов и т. Д. У меня сейчас есть отправитель и получатель, которые могут прекрасно общаться, когда они находятся на одном компьютере.Однако, как только я отправляю отправителя на другой компьютер, а не на мой получатель, отправитель отправляет свое сообщение, но мой получатель так и не получает его.Не выдается никаких исключений, и брандмауэр отключен на обеих машинах.

http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/, откуда я получил свой код.

Отправитель:

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

namespace UDPTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
            ProtocolType.Udp);
            sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
            IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
            byte[] data = Encoding.ASCII.GetBytes("This is a test message");
            sock.SendTo(data, iep);
            sock.Close();
        }
    }
}

Получатель:

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

namespace UDPBroadcastReciever
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Console.WriteLine("Ready to recieve");
            byte[] data = new byte[1024];
            int recv = sock.ReceiveFrom(data, ref ep);
            string stringData = Encoding.ASCII.GetString(data, 0, recv);
            Console.WriteLine("Received: {0} from: {1}", stringData, ep.ToString());
            sock.Close();
            Console.ReadLine();
        }
    }
}

Кто-нибудь знает что-то, чего мне не хватает, что позволило бы этим двум разговаривать на двух разных компьютерах?Они находятся в одной подсети (192.168.1.x)

Спасибо, Ник Лонг

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Возможно, вам лучше использовать многоадресную рассылку, чем широковещательную рассылку;широковещательные пакеты часто отбрасываются немедленно маршрутизаторами.Выберите IP-адрес где-нибудь в блоке 239.0.0.0/24 в качестве вашего многоадресного адреса;это зарезервировано для локальных сообщений организации, поэтому просто выберите номер в эфире и придерживайтесь его.

Вам нужно, чтобы ваш отправитель отправил свои пакеты на этот адрес и чтобы ваш получатель присоединился к многоадресной группе для полученияих.Чтобы присоединиться к группе многоадресной рассылки, вызовите это в своем сокете:

sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
    new MulticastOption(theMulticastIp));

Существует много дополнительной информации об использовании многоадресной рассылки в C # здесь .

0 голосов
/ 14 апреля 2015

У меня была похожая проблема, казалось, ничего не работало во всем коде, который я видел здесь. когда я запустил свою программу, появилось это окно брандмауэра, сообщающее, что брандмауэр заблокировал некоторые функции.

Моя проблема заключалась в том, что я нажимал «разрешить доступ», не устанавливая флажок «Частные сети, сосите как моя домашняя или рабочая сеть» Вы можете изменить это позже, конечно, в настройках брандмауэра и установить этот флажок. этот флажок должен быть установлен на сервере и на другом компьютере. Или, по крайней мере, именно это заставляет мою шахту работать.

Также мне пришлось изменить свой широковещательный IP-адрес, например, на 192.168.1.255. Мой роутер блокирует рекомендованные моей книгой 224.0.0.0 - 239.255.255.255;

...