Dada una 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 ingeniosa podría ser usar socket()/listen() y capturar EADDRINUSE, pero esperaba algo más limpio. Ni siquiera estoy seguro de si el kernel realiza un seguimiento de esto una vez que se establece la sesión.
EDITAR: También preferiría no llamar a netstat (o incluso ss) ya que ambos son demasiado lentos con muchos sockets abiertos. Este código se llamará a menudo.
Siempre el cliente realiza una conexión activa, enviando un SYN (al servidor). Entonces, dada una 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 aparece aquí, entonces es un socket del lado del cliente, por lo que inicia un SYN . Si está allí, entonces es un conector de escucha y, por lo tanto, ha recibido un SYN .
El código correspondiente queda 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 cree que netstat tiene poca velocidad para escanear todos los puertos, entonces la única forma de lograr la rapidez 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 la source address:port y destination address:port en dos tablas. Uno que es emisor de SYN y otro que es receptor.
Ahora, cuando le den un puerto y una dirección IP, realice un scan de los datos almacenados hasta el momento. También puede usar STL map de C++ para lograr resultados más rápidos.
Dado que puede haber muchas solicitudes, el map puede llenarse rápidamente, lo que ralentiza las búsquedas. Le aconsejo que procese también los paquetes FIN y, en base a eso, elimine las entradas correspondientes de la tabla.