Как я могу узнать, отправил ли я пакет UDP на открытый порт? - PullRequest
5 голосов
/ 09 января 2011

Я делаю программу на C, в которой мне нужно проверить открытые порты UDP на конечном компьютере. Поскольку UDP не имеет соединения, я не могу проверить возвращаемое значение connect(), как я могу с TCP.

send() и sendto() возвращаемые значения также не помогают. Страница руководства гласит:

   No  indication  of failure to deliver is implicit in a send().  Locally
   detected errors are indicated by a return value of -1.

Как узнать, отправил ли я пакет UDP на открытый порт на хосте назначения?

Ответы [ 2 ]

6 голосов
/ 09 января 2011

Как правило, вы не можете этого сделать.

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

Получение ошибки также проблематично.Linux имеет четко определенную, но сбивающую с толку семантику для поиска ошибок в сокетах (см. Различные справочные страницы, socket (7), ip (7) и udp (7) для получения дополнительной информации).Иногда вы будете видеть предыдущую ошибку, о которой сообщалось, например, когда вы выполняете несвязанную функцию sendto ().Другие ОС имеют слегка отличающиеся механизмы для получения определенных ошибок сокетов.

Если гарантированно будет определенный протокол на другом порту, вы можете отправить пакет, который должен вызвать конкретный ответ (если это ваш собственный протокол, вы можете добавить тип сообщения "вы там"), а затем вы можете использовать это.Но в целом вопрос о том, сгенерирован ли ответ, зависит от приложения, и вы не можете различить порт, который ничего не прослушивает, и порт, который прослушивает что-то, что решает не отвечать вам.

2 голосов
/ 09 января 2011

Поскольку UDP не подключен, вам необходимо проверить состояние порта в коде вашего приложения. Например, отправьте пакет в порт и дождитесь ответа. Если вы не получите ответ в какое-то определенное время приложения, порт недоступен.

Конечно, вы должны использовать это как для отправляющей, так и для принимающей стороны.

...