2010-07-21 4 views
2

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

Я попытался следующие:

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

, но без успеха.

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

+0

Довольно уверен, что вы не можете слушать «каждый» порт, подобный этому ... не понимаю, зачем вам тоже хотелось. – Fosco

+1

@Fosco: Сетевой сниффер? – MPritchard

+1

@MPritch: Тогда это не UDP. Вы будете слушать сырые пакеты ethernet. –

ответ

6

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

Необходимо указать порт! Порт является своего рода как идентификатор - этот пакет предназначен для этой программы (идентифицированной порт #)

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

+2

Покорять или нет, есть законные причины, чтобы хотеть этого. И он работает с RAW + UDP-сокетом в беспорядочном режиме (и работает на уровне администратора). –

+0

Как «безумно» получать на любом порту, но не сумасшедший, чтобы * отправлять * на любой порт? Если логика заключается в том, что порт определяет, к какой программе предназначены пакеты, которые будут применяться как к отправке, так и при получении, правильно? – Mud

4

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

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

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

5

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

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

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

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

+0

Пример API: pcapdotnet http://pcapdotnet.codeplex.com/ –

Смежные вопросы