Ainda não está claro se você deseja implementar netstat -a -t -u
ou a associação externa de /etc/services
e netstat -a -t -u
ou outra coisa, mas aqui estão algumas ideias que podem ajudar:
-
Os números das portas TCP e UDP variam de 1 a 65536. O arquivo
/etc/services
que você mencionou lista um subconjunto da portas bem conhecidas e portas registradas . Uma lista maior está em o nome da empresa e o número da porta do protocolo de transporte da IANA Registro . Você pode usar o getservent () para recuperar cada registro listado em/etc/services
. -
No Linux, você pode obter uma lista de todos os soquetes que estão em estado de escuta, conexão, conectado ou parcialmente fechado e seus endereços e portas locais e remotos, lendo os arquivos
/proc/net/tcp
,/proc/net/tcp6
,/proc/net/udp
e/proc/net/udp6
. A saída denetstat -a -t -u -n
é quase exatamente igual a esses arquivos, apenas muito mais bonita. Os endereços, números de porta e estados estão em hexadecimal. A versão bonita do campo de estado pode ser produzida usando os nomes em/usr/include/netinet/tcp.h
:
enum { TCP_ESTABLISHED = 1, TCP_SYN_SENT, TCP_SYN_RECV, TCP_FIN_WAIT1, TCP_FIN_WAIT2, TCP_TIME_WAIT, TCP_CLOSE, TCP_CLOSE_WAIT, TCP_LAST_ACK, TCP_LISTEN, TCP_CLOSING };
- No FreeBSD, você chamaria
sysctlbyname("net.inet.tcp.pcblist",...)
, que recupera uma matriz dextcpcb
structs. Provavelmente, é melhor olhar para o código-fontenetstat
para ver como interpretar essas estruturas.