UDP излъчващата система няма да комуникира на отделни компютри

Работя върху излъчващ маяк в 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)

Благодаря Ник Лонг


person nick    schedule 23.02.2012    source източник
comment
Вярвам, че не всеки рутер ще препраща излъчвани пакети. Може би можете да проверите това с друго приложение, за което е известно, че работи.   -  person usr    schedule 24.02.2012
comment
Имате ли предложение за примерна програма?   -  person nick    schedule 24.02.2012
comment
Проверете също C:\Windows\System32\LogFiles\Firewall и вижте дали профилът за мрежовите настройки блокира порта, на който излъчвате   -  person JeremyK    schedule 24.02.2012
comment
Също така предлагам да използвате wireshark, за да сте сигурни, че получавате съобщението   -  person JeremyK    schedule 24.02.2012
comment
Нищо в директорията с регистрационни файлове. Когато копирам/поставя намерения код msdn.microsoft.com/en-us/ библиотека/tst0kwb1.aspx там работи добре.   -  person nick    schedule 24.02.2012
comment
@nick Може да е, защото вие излъчвате към 255.255.255.255 (IPAddress.Broadcast) във вашия код и кодът на тази страница излъчва към 192.168.1.255.   -  person spencercw    schedule 24.02.2012
comment
@spencercw След като го промених, работи добре за излъчване през LAN. Следващото нещо, което трябва да направя, е да излъчва по интернет, така че нашето приложение на Android да знае къде да качва изображенията. Първоначално го кодирах твърдо, но шефът ми иска маяк.   -  person nick    schedule 24.02.2012
comment
@nick Няма да стане. Пакетите за мултикаст и излъчване няма да излязат от вътрешната ви мрежа (и ако го направят, ще спрат в момента, в който достигнат рутерите на вашия интернет доставчик). Най-добрият ви залог вероятно е да настроите HTTP сървър, към който приложението ви може периодично да се свързва, за да актуализира каквото ви трябва. Разбира се, ако направите това, така или иначе ще кодирате твърдо този адрес, така че вероятно няма смисъл.   -  person spencercw    schedule 24.02.2012
comment
@spencercw Това си помислих. Предполагам, че ще го направя и след това ще му кажа, че ще работи само в нашата вътрешна мрежа. Вече имаме http сървър, който хоства услугата, към която трябва да се свърже, с име на домейн и местоположението на приложението няма да се промени, така че не съм сигурен каква е ползата от настройването на нещо подобно   -  person nick    schedule 24.02.2012


Отговори (2)


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

Трябва да накарате вашия подател да изпрати своите пакети на този адрес и вашият получател да се присъедини към групата за мултикаст, за да ги получи. За да се присъедините към мултикаст групата, извикайте това на вашия сокет:

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

Има много повече информация относно използването на мултикаст в C# тук.

person spencercw    schedule 23.02.2012

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

проблемът ми беше, че щраквах върху разрешаване на достъп, без да поставя отметка в квадратчето, което гласи „Частни мрежи, смучат като моята домашна или работна мрежа“. можете да промените това по-късно, разбира се, в настройките на вашата защитна стена и да поставите отметка в това квадратче. както de server, така и другата машина трябва да имат отметка в квадратчето. Или поне това кара моята мина да работи.

Също така трябваше да сменя моя излъчван IP адрес на например 192.168.1.255. Моят рутер блокира препоръчаните от моята книга 224.0.0.0 - 239.255.255.255;

person user3130012    schedule 14.04.2015