web-development-kb-es.site

¿Cómo creo paquetes RAW TCP / IP en C ++?

Soy un programador/administrador de red principiante de C++, pero creo que puedo aprender a hacer esto si alguien me indica la dirección correcta. La mayoría de los tutoriales se demuestran utilizando código antiguo que ya no funciona por alguna razón.

Como estoy en Linux, todo lo que necesito es una explicación sobre cómo escribir sockets Berkeley sin procesar. ¿Alguien puede darme un recorrido rápido?

19
Tim

Empiece leyendo Guía de Beej sobre programación de enchufes . Le pondrá al día sobre cómo empezar a escribir código de red. Después de eso, debería poder obtener más y más información leyendo las páginas de manual.

La mayor parte consistirá en leer la documentación de su biblioteca favorita y una comprensión básica de las páginas de manual.

13
X-Istence

Para empezar, sería útil que aclarara lo que quiere decir con "crudo". Tradicionalmente, esto significa que desea crear todo el encabezado de la capa 4 (encabezado TCP/UDP/ICMP ...), y tal vez parte del encabezado IP por su cuenta. Para esto, necesitará más que el tutorial de beej, que ya se ha mencionado aquí. En este caso, desea que los sockets de IP sin procesar se obtengan utilizando el argumento SOCK_RAW en su llamada a socket (consulte http://mixter.void.ru/rawip.html para algunos conceptos básicos).

Si lo que realmente desea es poder establecer una conexión TCP a algún host remoto como el puerto 80 en stackoverflow.com, entonces probablemente no necesite sockets "crudos" y beej's La guía te servirá bien.

Para obtener una referencia autorizada sobre el tema, debería leer Programación de red Unix, Volumen 1: La API de redes de sockets (3ª edición) de Stevens et al.

10
Chris

Para TCP lado del cliente:

Use gethostbyname para buscar dns name en IP, devolverá una estructura de hospedaje. Llamemos a este valor devuelto Host.

hostent *Host = gethostbyname(HOSTNAME_CSTR);

Llene la estructura de la dirección del socket:

sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(REMOTE_PORT);
sock.sin_addr.s_addr = ((struct in_addr *)(Host->h_addr))->s_addr;

Cree un socket y llame a connect:

s = socket(AF_INET, SOCK_STREAM, 0); 
connect(s, (struct sockaddr *)&sock, sizeof(sock))

Para TCP lado del servidor:

Configurar un enchufe

Vincula tu dirección a ese socket usando bind.

Empiece a escuchar en ese enchufe con listen

Llame a aceptar para obtener un cliente conectado. <- en este punto, genera un nuevo hilo para manejar la conexión mientras realiza otra llamada para aceptar y obtener el próximo cliente conectado.

Comunicación general:

Utilice send y recv para leer y escribir entre el cliente y el servidor.

Ejemplo de código fuente de conectores BSD:

Puede encontrar un buen código de ejemplo de esto en wikipedia .

Lectura adicional:

Recomiendo encarecidamente este libro y este tutorial en línea :

alt text

4 :

6
Brian R. Bondy

Un buen lugar para comenzar sería usar Asio , que es una excelente biblioteca multiplataforma (incluido Linux) para la comunicación en red.

5
Tom Leys

Lo hace exactamente de la misma manera que lo haría en C normal, no hay una forma específica de C++ de hacerlo en la biblioteca estándar.

El tutorial que utilicé para aprender esto fue http://beej.us/guide/bgnet/ . Fue el mejor tutorial que encontré después de mirar alrededor, dio ejemplos claros y buenas explicaciones de todas las funciones que describe.

3
HappySmileMan

He estado desarrollando libtins durante el último año. Es una biblioteca de rastreo y elaboración de paquetes de C++ de alto nivel.

A menos que desee reinventar la rueda e implementar los componentes internos de cada protocolo, le recomiendo que use una biblioteca de nivel superior que ya lo hace por usted.

2
mfontanini

Leer Programación de red Unix por Richard Stevens. Es un deber. Explica cómo funciona todo, le brinda código e incluso le brinda métodos de ayuda. Es posible que desee consultar algunos de sus otros libros. Programación avanzada en el entorno Unix es imprescindible para la programación de bajo nivel en Unix es general. Ya ni siquiera hago cosas en la pila de Unix, y las cosas de estos libros todavía me ayudan a codificar.

1
Charles Graham

Libpcap le permitirá crear paquetes completos (capa 2 a capa 7) y enviarlos por el cable. Por divertido que parezca, hay algunas salvedades. Necesita crear todos los encabezados apropiados y hacer toda la suma de verificación usted mismo. Libnet puede ayudar con eso, sin embargo.

Si desea salir del grupo de programación de C++, existe scapy para python. Hace que sea trivial crear y transmitir paquetes TCP/IP.

1
jdizzle

Hay toneladas de referencias sobre esto (por supuesto, me viene a la mente el libro de Stevens), pero encontré la guía Beej increíblemente útil para empezar. Es lo suficientemente sustancioso como para que puedas entender lo que realmente está sucediendo, pero es lo suficientemente simple como para que no te lleve varios días escribir un cliente/servidor udp de 'hola mundo'.

1
Ben Collins

fácil:

#include <sys/socket.h>
#include <sys/types.h>

int socket(int protocolFamily, int Type, int Protocol)
// returns a socket descriptor

int bind(int socketDescriptor, struct sockaddr* localAddress, unsigned int addressLength)
// returns 0 

... etc.

todo está en sys/socket.h

1
vimm

Póster, aclara tu pregunta.

Casi todas las respuestas parecen pensar que estás pidiendo un tutorial de sockets; Leí su pregunta en el sentido de que necesita crear un socket sin procesar capaz de enviar paquetes IP arbitrarios. Como dije en mi respuesta anterior, algunos sistemas operativos restringen el uso de sockets sin formato.

http://linux.die.net/man/7/raw "Solo los procesos con un ID de usuario efectivo de 0 o la capacidad CAP_NET_RAW pueden abrir sockets sin procesar".

1
Mike F