c++ - ejemplos - protocolo udp caracteristicas
Determinar quién abrió una sesión TCP (1)
Siempre el cliente realiza una conexión activa, enviando un SYN
(al servidor). Entonces, dado un IP local y un número de puerto, verifique si es un socket de escucha usando el siguiente comando:
netstat --listening | grep given_ip:given_port
Si no figura aquí, entonces es un socket del lado del cliente, por lo tanto, inicia un SYN
. Si está allí, entonces es un socket de escucha y, por lo tanto, ha recibido un SYN
.
El código correspondiente se ve de la siguiente manera:
system("netstat --listening | grep given_ip:given_port > tmp.txt");
int fd = open("tmp.txt", O_RDONLY);
char buf[100] ;
if(read(fd,buf,100)>0)
printf("The socket has received a SYN!");
else
printf("The socket has sent a SYN!");
EDITAR:
Si siente que netstat
tiene poca velocidad para escanear todos los puertos, entonces la única forma de lograr la solidez es abrir un raw socket
y configurarlo para recibir todos los paquetes TCP
.
Procese solo aquellos paquetes que contengan un SYN
en ellos. Ahora, almacene ambas source address:port
y destination address:port
en dos tablas. Uno que es un emisor de SYN
y otro que es un receptor.
Ahora, cuando se le proporcione un puerto y una dirección IP, realice un scan
los datos almacenados hasta el momento. También puede usar el STL map
de C++
para lograr resultados más rápidos.
Como puede haber muchas solicitudes, el map
puede llenarse rápidamente, haciendo que las búsquedas sean lentas. También le aconsejo que procese los paquetes FIN
y, en base a eso, elimine las entradas correspondientes de la tabla.
Dado un IP local y un puerto para una sesión TCP establecida, ¿puedo averiguar qué lado envió el SYN inicial? Es decir, ¿esta conexión se abrió activa o pasivamente? Necesito algo que funcione en C / C ++ en Linux. Una forma muy divertida podría ser socket () / listen () y capturar EADDRINUSE, pero esperaba algo más limpio. Ni siquiera estoy seguro de si el núcleo rastrea esto una vez que se establece la sesión.
EDITAR: También preferiría no llamar a netstat (o incluso a ss) ya que ambos son demasiado lentos con muchos sockets abiertos. Este código se llamará a menudo.