Как получить список открытых сокетов в Linux с помощью C? - PullRequest
7 голосов
/ 09 мая 2009

Есть ли способ получить список всех открытых сокетов (адрес сокета или дескриптор сокета) в Linux, используя C в пользовательском пространстве или ядре?

Спасибо

Ответы [ 4 ]

16 голосов
/ 09 мая 2009

Откройте и прочитайте следующее:

/proc/net/tcp - список открытых TCP-сокетов

/proc/net/udp - список открытых UDP-сокетов

/proc/net/raw - список всех «сырых» розеток

Это как «обычные» файлы, которые вы открываете и читаете с помощью файлового дескриптора, и предоставят вам всю необходимую информацию о каждом сокете.

4 голосов
/ 09 мая 2009

Эта программа может быть полезна для вас и демонстрирует, как анализировать файлы / net / proc / * sockstat.c

3 голосов
/ 09 мая 2009

В каталоге / proc / self / fd есть поддельные символические ссылки, дающие вам все ваши дескрипторы открытых файлов - сокеты дают что-то вроде:

lrwx------ 1 root root 64 2009-05-08 07:45 4 -> socket:[4921]
lrwx------ 1 root root 64 2009-05-08 07:45 5 -> socket:[4918]
lrwx------ 1 root root 64 2009-05-08 07:45 6 -> socket:[5395]

Итерируйте их, используя opendir, readdir (), а затем опрашивайте их, используя readlink ()

Если вы знаете, что FD 4 является сокетом, вы можете вызвать для него функцию getsockname (), чтобы получить семейство локальных адресов, адрес и т. Д., Если они связаны.

0 голосов
/ 09 мая 2009

Необработанные данные можно найти в / proc / net / tcp, / proc / net / udp и т. Д. См. Заголовок в первой строке для краткого описания.

...