Estou tentando escrever um programa (em C) que, como um de seus recursos, percorre os procfs para encontrar soquetes abertos e verificar coisas como as portas/endereços de destino/origem (semelhante ao que netstat e lsof fazem). No entanto, não tenho certeza de qual chamada de sistema usar quando encontrar um arquivo de soquete. Por exemplo, suponha que eu liguei readlink
e /proc/123/fd/4
voltei socket:[56789]
. O que posso fazer com essas informações, usando apenas a API do sistema, para obter os detalhes do soquete?
Eu tentei correr strace
, netstat
mas não está claro o que está acontecendo. Eu vejo um read
ligado /proc/123/fdinfo/4
, mas não entendo do que se trata.
Por exemplo, o fdinfo
arquivo para uma conexão aberta (conexão TCP para 127.0.0.1:5000) mostra
pos: 0
flags: 04002
mnt_id: 9
Você primeiro precisa ler
/proc/net/tcp
quais listas, para seu namespace de rede, os detalhes de todas as conexões TCP/IP abertas (procure conexões/proc/net/tcp6
TCP/IPv6). Essas informações incluem os números de inode associados. Uma linha de exemplo desse arquivo éIsso significa que o
00000000:0016
soquete está escutando na0.0.0.0
porta 22. Sabemos que este é um soquete de escuta, pois o endereço do par (00000000:0000
) é todo zero. Podemos ver que o inode para este socket é 19691.Uma vez armado com esses números, você pode combiná-los com as listagens em
/proc/<pid>/fd
. Por exemplo,socket:[12345]
significa que o soquete está no inode 12345.