Как получать UDP-пакеты с любого ip и любого порта? - PullRequest
2 голосов
/ 21 июля 2010

Я хотел использовать C # UdpClient для прослушивания любых входящих пакетов UDP. Я хочу получать пакеты с любого IP и любого порта.

Я попробовал следующее:

UdpClient udpClient = new UdpClient(0);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref ep);

но безуспешно.

Кто-нибудь знает, что не так? Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 21 июля 2010

ПОЛУЧИТЬ на любой порт?Это безумие.Вы будете переполнены сообщениями из других приложений (попробуйте TcpView , чтобы узнать, сколько сообщений передается в вашей системе в секунду!)

Вы должны указать порт!Порт в некотором роде похож на идентификатор - этот пакет предназначен для ЭТОЙ программы (идентифицируемой портом #)

Отправка на любой порт является разумной, поскольку она просит систему выбрать портотправить OUT-порт для вас - что на самом деле не так важно для вашего приложения, как отправитель иногда

5 голосов
/ 21 июля 2010

Ваша лучшая идея - определить конкретные порты, которые вы хотели бы прослушивать, и начать прослушивать их.В зависимости от того, что делается с полученными дейтаграммами, может быть лучше / проще создать новый Thread для каждого порта, который вы прослушиваете, и обработать его там, либо поставить в очередь в синхронизированную (с lock) очередь или список, для обработки в центральном потоке.

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

При этом можно было использовать что-то вроде Wireshark или Winpcap SDK / API для «перехвата» UDP-пакетов прямо с сетевого адаптера.Раньше я работал в приложении .NET без особых проблем.

Надеюсь, это поможет.

4 голосов
/ 21 июля 2010

Вам нужно прослушивать определенный порт.

Передавая ноль, вы назначаете произвольный порт, поэтому вы будете получать только дейтаграммы UDP, адресованные ему. Другими словами, вы ничего не получите.

Если вы что-то получили, IPEndPoint будет заполнен информацией об отправителе. Начальное значение может быть использовано для ограничения отправителя.

...