Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

257
Views
Determinar quién abrió una sesión TCP

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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!