significado protocolo ejemplos caracteristicas capa aplicacion c++ c linux sockets network-programming

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.