LINUX.ORG.RU

UDP sendto как понять открыт ли порт?

 ,


1

2

Здравствуйте, коллеги!

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
i = s.sendto("Hello".encode(), (127.0.0.1, 8080))

Насколько я понял, если 127.0.0.1 не слушает UDP порт 8080, то сервер должен вернуть ICMP сообщение, что невозможно доставить сообщение.

Собственно, вопрос: как эту ситуацию отлавливать? sendto просто возвращает число отправленных байтов и ему наплевать дошел ли пакет до получателя или нет. Как понять, что его ни кто не слушает? Понятно, что если на другом конце ни кто не слушает UDP 8080, то recvfrom ни когда ни чего не получит, но мне интересно как определить, открыть ли нужный UDP порт?



Последнее исправление: HighMan (всего исправлений: 1)

Насколько я понял, если 127.0.0.1 не слушает UDP порт 8080, то сервер должен вернуть ICMP сообщение, что невозможно доставить сообщение.

Не должен.

как эту ситуацию отлавливать

recvfrom вернёт ошибку. Но повторюсь, что полагаться на это нельзя. Во-первых многие настраивают фаерволы так, чтобы они ничего не отвечали. Во-вторых ответ может потеряться. В-третьих твой исходный запрос может потеряться. Это же UDP.

vbr ★★★★
()

Ошибка, вроде, называется ECONNREFUSED, погуглите. Она будет возвращена на следующий sendto или recvfrom, следующий после получения ядром icmp port unreachable. И лучше поизучайте поведение ядра, что будет в случаях icmp host/net unreachable.

И, ЕМНИП, со 127.0.0.1 может быть другое поведение, чем с реальной передачей по сети.

Ну, и в современных реалиях icmp в случае «другом конце ни кто не слушает» возникает, только если на другом конце кто-то должен слушать, но упал, а не перекрытый файерволом порт.

mky ★★★★★
()

Если никто не слушает - будет ответный ICMP_PORT_UNREACH, но для того чтобы получить этот ответ нужно прочитать данные из сокета с флагом MSG_ERRQUEUE

С другой стороны, udp не гарантирует доставки и приложение должно само соображать, что если нет ответа за какое-то время, значит там нет никого.

vel ★★★★★
()

UDP sendto как понять открыт ли порт?

Гугл nmap, netcat, nc, iperf3. Создаешь чятик между компами. Если эхо есть — все норм.

Собственно, вопрос: как эту ситуацию отлавливать?

В их сорцах и подсмотри :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

Какая милота - его спрашивают про API сокетов, а он вываливает названия утилит о которых в «хакере» что-то читал - не важно, в тему или нет, и не повторяется ли там одна утилита два раза:)))

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Слы, душная «милота» на букву Х, перечитай заголовок и найди там про API сокетов:) Какой вопрос, такой ответ. Алсо «джва раза» это про «гугл», считать умеешь, читать не умеешь, содись два. Упоминание журнала ксакеп больше говорит о тебе.)))

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 3)
Ответ на: комментарий от jo_b1ack

насколько я помню sendto глубоко фиолетово открыт порт или нет, он пульнул, а дальше не его дело.

Всё правильно. Только это не отменяет факта что ICMP packet если порт закрыт обратно таки летит (периодически). И можно это дело поймать и отреагировать. Более того - емнип есть разница делать connect() на UDP сокете (да да, именно connect() именно на UDP сокете - я не в маразме) или нет в плане будет взводиться error bit в select() или нет.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

Слы, душная «милота» на букву Х, перечитай заголовок и найди там про API сокетов:)

Во-первых, прежде чем начинать писать бред нужно прочитать дальше заголовка. Во-вторых, в заголовке ясно написано - sendto. Это вызов API сокетов. Но откуда тебе это знать.

Какой вопрос, такой ответ. Алсо «джва раза» это про «гугл»

Нет, это про netcat. Господи, ну и дно…

slovazap ★★★★★
()
Ответ на: комментарий от bugfixer

Они не дело говорят, а душнят, либо пытаются дешево самоутвердиться. Лор давно не торт именно из-за них. Из-за дешевок без ЧЮ с надутыми щеками.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от slovazap

Во-первых, откройте форточку, здесь стало душно. Во-вторых, сдувайте щоки, кэп, ну и дно — это другое. Дно это душнить объявляя общеизвестное как будто это известно только вам. Например, упоминание гугла вы игнорите именно поэтому. Называется «выборочное цитирование».

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 4)