c++ - sockaddr_in - socket programacion
¿Cómo creo paquetes RAW TCP/IP en C++? (11)
Soy un programador / administrador de red de C ++, pero creo que puedo aprender a hacer esto si alguien me apunta en la dirección correcta. La mayoría de los tutoriales se demuestran utilizando un código antiguo que ya no funciona por algún motivo.
Como estoy en Linux, todo lo que necesito es una explicación sobre cómo escribir tomas de Berkeley sin procesar. ¿Alguien puede darme una carrera rápida?
Comience leyendo la guía de Beej sobre la programación del zócalo . Le informará sobre cómo comenzar 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 man.
La mayor parte consistirá en leer la documentación de su biblioteca favorita y una comprensión básica de las páginas man.
Hay toneladas de referencias sobre esto (por supuesto, el libro de Stevens viene a la mente), pero encontré que la guía Beej es increíblemente útil para comenzar. Es lo suficientemente sustancioso como para que puedas entender lo que realmente está sucediendo, pero es lo suficientemente simple como para que no te tome varios días escribir un cliente / servidor udp "hello world".
Lea la Programación de Red Unix por Richard Stevens. Es un deber. Explica cómo funciona todo, te da código e incluso te brinda métodos de ayuda. Es posible que desee revisar algunos de sus otros libros. La programación avanzada en Unix Enviernment es una necesidad para la programación de nivel inferior en Unix es general. Ni siquiera hago cosas en la pila de Unix, y el material de estos libros aún me ayuda a codificar.
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 formato capaz de enviar paquetes IP arbitrarios. Como dije en mi respuesta anterior, algunos sistemas operativos restringen el uso de conectores 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 conexiones sin formato."
Para empezar, sería útil si aclaras lo que quieres decir con "crudo". Tradicionalmente esto significa que desea crear todo el encabezado de capa 4 (encabezado TCP / UDP / ICMP ...) y tal vez parte del encabezado IP por su cuenta. Para esto necesitarás más que el tutorial de beej, que ya mencioné aquí mis muchos. En este caso, desea obtener los conectores de IP sin procesar utilizando el argumento SOCK_RAW en su llamada al socket (consulte http://mixter.void.ru/rawip.html para conocer algunos conceptos básicos).
Si lo que realmente desea es solo poder establecer una conexión TCP con algún host remoto como el puerto 80 en .com, entonces probablemente no necesite conectores "crudos" y la guía de beej le servirá bien.
Para una referencia autorizada sobre el tema, realmente debería elegir Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition) de Stevens et al.
Usted hace esto exactamente de la misma manera que lo haría en C normal, no hay forma específica de C ++ para hacer esto 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.
Un buen lugar para comenzar sería utilizar Asio, que es una gran biblioteca multiplataforma (incluida Linux) para la comunicación de red.
Libpcap te permitirá crear paquetes completos (layer2 a layer 7) y enviarlos a través del cable. Aunque suena divertido, hay algunas advertencias con eso. Debe crear todos los encabezados apropiados y hacer todas las sumas de comprobación usted mismo. Libnet puede ayudar con eso, sin embargo.
Si desea salir del grupo de programación de C ++, Scapy tiene pitón. Hace trivial crear y transmitir paquetes TCP / IP.
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.
está todo en sys / socket.h
Para el lado del cliente TCP:
Use gethostbyname para buscar el nombre dns en IP, devolverá una estructura hostent. Llamemos a este host de valor devuelto.
hostent *host = gethostbyname(HOSTNAME_CSTR);
Complete la estructura de 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;
Crear un socket y llamar a connect:
s = socket(AF_INET, SOCK_STREAM, 0);
connect(s, (struct sockaddr *)&sock, sizeof(sock))
Para el lado del servidor TCP:
Configurar un socket
Vincula tu dirección a ese socket usando bind.
Comienza a escuchar en esa toma con escuchar
Llamar 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:
Use enviar y recv para leer y escribir entre el cliente y el servidor.
Ejemplo del código fuente de los zócalos BSD:
Puedes encontrar un buen código de ejemplo de esto en wikipedia .
Otras lecturas:
Recomiendo mucho este libro y este tutorial en línea :
4 :
He estado desarrollando libtins durante el año pasado. Es una biblioteca de elaboración y olfateo de paquetes C ++ de alto nivel.
A menos que desee reinventar la rueda e implementar las partes internas de cada protocolo, le recomendaría usar una biblioteca de nivel superior que ya lo haga por usted.