Мое приложение не получает данные с помощью UdpClient

Я создал очень простое приложение для получения DHCP-сообщений с помощью UdpClient.

UdpState s = new UdpState();
s.u = server;
s.e = ClientEndPoint;

server = new UdpClient();
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.Client.Bind(new IPEndPoint(IPAddress.Any, 67));
server.BeginReceive(new AsyncCallback(OnRecieve), s);

void OnRecieve(IAsyncResult asycnResult)
{
   Console.WriteLine("Got something");

   // Do something
}

У меня есть устройство, которое запрашивает IP-адрес и поэтому отправляет запрос каждые 5 секунд и т. д. OnRecieve никогда не срабатывает, и я дважды проверил, поставив точку останова в Console.WriteLine.

Чтобы проверить, было ли это соединение или ПК, я скачал Microsoft Network Monitor и сделал захват. Это отлично фиксирует запросы, поэтому я знаю, что это как-то связано с моей программой.

Любые идеи?


person Gaz83    schedule 26.09.2012    source источник
comment
Правильно ли настроен брандмауэр для машины? Получаете ли вы какие-либо другие сообщения UDP, которые вы отправляете себе, например, с помощью тестового клиента?   -  person Thorsten Dittmar    schedule 26.09.2012
comment
Вы уверены, что он отправляет запрос каждые 5 секунд на порт BOOTP? (67), который обычно используется для запроса IP-адреса от DHCP при загрузке компьютера.   -  person Peter Ritchie    schedule 26.09.2012
comment
@ThorstenDittmar Я не вижу настройки брандмауэра, так как это рабочий компьютер, и все это настроено с помощью политик. Но если приложение сетевого монитора видит данные, то наверняка брандмауэр их не блокирует? или вы говорите, что брандмауэр может блокировать получение моего приложения?   -  person Gaz83    schedule 26.09.2012
comment
Ваше приложение может быть заблокировано (поскольку оно может не прослушивать порт UDP), или брандмауэр может заблокировать ваш компьютер от фактического получения пакетов (чего не должно быть, если вы видите пакеты, поступающие на ваш компьютер).   -  person Thorsten Dittmar    schedule 26.09.2012
comment
Я чувствую, что это брандмауэр. Я просто запустил приложение как .exe, и брандмауэр выскочил, сказав, что он блокируется, и дал мне возможность разблокировать доменную сеть и частную сеть. Поэтому я отметил оба, но все еще не получил данные. Затем я зашел в Центр управления сетями и общим доступом и заметил, что Сеть была установлена ​​​​как общедоступная. Затем я обнаруживаю, что не могу изменить это, пока у сетевого адаптера не будет шлюза по умолчанию. Поэтому я пытаюсь установить это, и как только я выхожу из свойств адаптера и снова возвращаюсь в сброс настроек шлюза !!   -  person Gaz83    schedule 26.09.2012


Ответы (1)


Что ж

Я поместил следующее в консольное приложение

      static Boolean done = false;
        static void Main(string[] args)
        {
            Object s = new object();


            UdpClient server = new UdpClient(); 
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
server.Client.Bind(new IPEndPoint(IPAddress.Any, 67)); 
server.BeginReceive(new AsyncCallback(OnRecieve), s);

while (!done) { Thread.Sleep(10); }

        }

        static void OnRecieve(IAsyncResult asycnResult)
        {
            Console.WriteLine("Got something");
            done = true;

            // Do something 
        } 
}

и через какое-то время "что-то получилось"

Я бы сделал вывод, что либо ваш udpclient не ждет - скорее всего ... поэтому я добавил цикл while.

person BugFinder    schedule 26.09.2012
comment
Так он до сих пор сидит и ничего не делает? - person BugFinder; 26.09.2012
comment
Конечно, вам нужен цикл, так как без цикла приложение завершает работу сразу после запуска BeginReceive, выходя из основного метода. Если приложение не запущено, оно ничего не может получить. - person Thorsten Dittmar; 26.09.2012
comment
Поэтому я разместил рабочий фрагмент, так как мой работает. Его не было напрямую, если не было другого кода. - person BugFinder; 26.09.2012
comment
@ThorstenDittmar Я скопировал и вставил код BudFinder в новое приложение (консольное приложение) и запустил его. Я просто получаю консоль, сидящую там. - person Gaz83; 26.09.2012
comment
Что NETSTAT говорит о порте 67 во время работы вашего приложения? Он показывает порт как открытый? Что, если вы запустите сканер портов на своей машине? - person Thorsten Dittmar; 26.09.2012
comment
Тогда вы ничего не получаете - у меня это работает. Код не проблема, как только мое консольное приложение заработает, вы можете беспокоиться об улучшении своего приложения, а до тех пор вам нужно найти то, что блокирует данные - person BugFinder; 26.09.2012