Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

260
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda