Я не понимаю, как такая функциональность может быть реализована исключительно с помощью модуля socket
. Модуль socket
предназначен для работы непосредственно с сокетами: открытие / закрытие, отправка / получение и т. Д. c. Это просто тонкая оболочка над стандартным интерфейсом сокетов BSD.
С другой стороны, получение метаданных о существующих сокетах, уже размещенных в системе, требует знания других процессов, работающих в системе. Это имеет мало общего с фактическим манипулированием сокетом, и гораздо больше связано с мониторингом других процессов и / или их файловых дескрипторов.
Например, кажется, что и ss
, и netstat
фактически реализованы (по крайней мере, на Linux) путем чтения и анализа псевдофайловой системы /proc
. (См. здесь и здесь , например.) Ядро управляет процессами и их открытыми сокетами и предоставляет (некоторые из) информацию о них другим процессам через procfs
. Это обеспечивает простой и безопасный способ экспорта некоторой информации о процессах в пространство пользователя, избавляя от необходимости большого количества системных вызовов или непосредственного чтения структур данных ядра.
Обратите внимание, что в значительной степени имеет работать таким образом. Строгая изоляция процесса требует, чтобы информация об открытых файлах другого процесса, включая сокеты, каким-то образом проходила через ядро. Это может быть либо через procfs
на Linux, либо через какой-либо API, предоставляемый ядром (например, libproc
на macOS). Все остальное будет огромной дырой в безопасности.
В качестве альтернативы модулю socket
, вы можете попробовать пакет psutil
или что-то подобное. Функция psutil.net_connections()
кажется подходящей.