2010-05-31 1 views
4

Как проверить с помощью C, если порт на моем локальном компьютере (если требуется, передавая IP или интерфейс, тоже), находится в состоянии прослушивания? Я не хочу подключаться к этому порту для проверки, потому что я не хочу раздражать службу за этим портом.В linux, как проверить, находится ли порт в состоянии прослушивания, не пытаясь подключиться

Я хочу использовать это, чтобы добавить отсутствующий элемент net.tcp.listen в Zabbix.

EDIT - ЭТО РЕАЛЬНАЯ ОТВЕТ:

Правильный путь для чтения таблиц сокетов:

/Труды/нетто/TCP /ргос/сеть/tcp6

Они содержат строки например:

sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 
0: 00000000:1F40 00000000:0000 0A 00000000:00000000 00:00000000 00000000 101  0 4083927 1 f5d15240 750 0 0 2 -1 
1: 00000000:2742 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1002  0 6100 1 decd76c0 750 0 0 2 -1 

и может легко анализироваться для прослушивания сокетов (dst: 00000000: 0000). Строка на netstat показывает, что netstat работает одинаково.

+0

Вы должны отправить ответ на свой вопрос, а затем принять его, а не включать его в вопрос. – Langston

ответ

2

Нечто вроде netstat?

`netstat -anp` 

Показать все порты и делать трюк.

Поскольку это программное обеспечение с открытым исходным кодом, вы, вероятно, можете немного вдохнуть в него. И я считаю, что это написано на C.

+1

Хорошая идея. Netstat должен быть вызван с -l, подумал. – Daniel

+0

@ Daniel: Спасибо;) Я не был уверен в параметрах и в настоящий момент не имею Linux. – ereOn

+0

Ваша идея, однако, позволила мне сделать «strace netstat -l», которая показала мне реальное решение (см. Мой ответ на этот вопрос). – Daniel

6

Просто попробуйте открыть порт для прослушивания. Вы получите сообщение об ошибке.

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

+0

, вероятно, самый портативный способ, тоже – matja

+0

Это не укажет, находится ли порт в состоянии 'listen' или в состоянии' connected '. Просто, что он используется. – ereOn

+1

Хорошая идея. К сожалению, состояние гонки означает, что ваша служба, если она попытается использовать свой порт точно в тот же момент, может вызвать ошибку. – Daniel

-1

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

nmap localhost 

должен обрабатывать его для вас

+1

очень, очень плохая идея – unbeli

+0

Как я уже говорил, я не хочу подключаться к порту, даже если nmap выполнил скрытые проверки, которые не будут доступны для приложения. – Daniel

0

По вашему запросу это, кажется, что вы хотите проверить открытый порт на вашем сервере, но уверены, какую команду нужно выполнить , Не нужно беспокоиться, например, мы пытаемся выяснить, открыт ли порт 80 на вашем сервере.

Первый Войти на сервер в качестве корневого пользователя

[email protected][~]# whoami 
root 

Теперь запустите следующую команду.

[email protected][~]# netstat -anp | grep :80 

Он выдаст следующий выход, если порт 80 открыт.

tcp  0  0 78.129.128.40:80   207.46.12.20:62746   TIME_WAIT - 
tcp  0  0 78.129.128.40:80   74.53.3.132:47003   TIME_WAIT - 
tcp  0  0 78.129.128.40:80   85.9.80.110:63325   FIN_WAIT2 - 

И если порт 80 заблокирован на вашем сервере, вы не получите никакого выхода.

Вы также можете использовать следующий URL-адрес для проверки открытых портов на вашем сервере.

http://www.yougetsignal.com/tools/open-ports/

С уважением, Gunjan

+1

Мне нужно это для инструмента мониторинга, чтобы ссылаться на другие сайты не представляется возможным. Кроме того, я хотел реализовать это в C, а не в командах оболочки. – Daniel

2

Правильный путь для чтения таблиц сокетов:

/Труды/нетто/TCP /ргос/сеть/tcp6

Они содержат линии, такие как:

sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 
0: 00000000:1F40 00000000:0000 0A 00000000:00000000 00:00000000 00000000 101  0 4083927 1 f5d15240 750 0 0 2 -1 
1: 00000000:2742 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1002  0 6100 1 decd76c0 750 0 0 2 -1 

и может легко анализироваться для прослушивания сокетов (dst: 00000000: 0000). Строка на netstat показывает, что netstat работает одинаково.

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