Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: r1ghtz0 en Octubre 13, 2014, 02:18:53 am

Título: [Solucionado] Programando socke cliente y servidor en C
Publicado por: r1ghtz0 en Octubre 13, 2014, 02:18:53 am
Aquí está el servidor, lo que hago es ingresar los datos del servidor pero me gustaría ver cual es la ip que se le asigna al servidor con INADDR_ANY, ¿Como puedo hacer para ver la ip del server?

Servidor:
Código: C
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5.  
  6. int main(void)
  7. {
  8.         /* Abriendo socket */
  9.         int sockfd, new_sockfd;
  10.         struct sockaddr_in server_addr;
  11.         struct sockaddr_in cliente_addr;
  12.         int addrlen;
  13.        
  14.         sockfd= socket(AF_INET, SOCK_STREAM, 0);
  15.         if(sockfd == -1){
  16.                 printf("Error abriendo el socket...");
  17.                 }
  18.        
  19.         /* Asociación de parámetros al socket */
  20.         server_addr.sin_family= AF_INET;
  21.         server_addr.sin_port= htons(1234);
  22.         server_addr.sin_addr.s_addr= htonl(INADDR_ANY);
  23.        
  24.         if(bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr))==-1){
  25.                 printf("\nError en bind()...");
  26.                 }
  27.        
  28.         /* Habilitamos el socket para recibir peticiones y establecer conexiones */
  29.         listen(sockfd, 5);
  30.         addrlen= sizeof(struct sockaddr);
  31.        
  32.         /* Recibimos peticiones con accept() */
  33.         new_sockfd= accept(sockfd, (struct sockaddr *) &cliente_addr, &addrlen);
  34.         if(new_sockfd == -1){
  35.                 printf("Error, no se pudo recibir petición correctamente");
  36.                 }
  37.        
  38.         return 0;
  39. }
  40.  
  41.  

Ahora lo que no entiendo en el cliente es cómo se le asignan los datos, es decir, cómo o de donde el cliente optiene su puerto de origen  y su direción ip, porque no se especifican en ningun lado, solo estan los datos del servidor, es todo.

Cliente:
Código: C
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5.  
  6. int main(void)
  7. {
  8.         struct sockaddr_in server;
  9.         char ip[16];
  10.         int fd, puerto;
  11.         int addrlen;
  12.        
  13.         printf("Ingrese la ip del servidor\n");
  14.         scanf("%s", ip);
  15.        
  16.         printf("Ingrese el puerto de conexión\n");
  17.         scanf("%d", &puerto);
  18.        
  19.         /* Abrimos el socket */
  20.         fd= socket(AF_INET, SOCK_STREAM, 0);
  21.         if(fd==-1){
  22.                 printf("Error abriendo el socket");
  23.                 return -1;
  24.                 }
  25.        
  26.         /* Definimos los datos del servidor */
  27.         server.sin_family= AF_INET;
  28.         server.sin_port= htons(1234);
  29.         server.sin_addr.s_addr= inet_addr(ip);
  30.        
  31.         addrlen= sizeof(struct sockaddr);
  32.        
  33.         if(connect(fd, (struct sockaddr *)&server, addrlen) == -1){
  34.                 printf("\nHa ocurrido un error al conectarce al server");
  35.                 }
  36.        
  37.        
  38.         return 0;
  39. }
  40.  
  41.  
Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: ravenheart en Octubre 13, 2014, 08:55:20 am
La dirección del cliente es la del ordenador local, así que no hay que especificarla, porque ya la conocemos.

Esto en realidad es algo más complejo, porque un ordenador puede tener varias IPs (normalmente, como mínimo hay dos: la IP de localhost, 127.0.0.1, y una IP de red), y a veces es necesario especificar la IP que se quiere usar.

El puerto también se escoge automáticamente, aunque también creo recordar que se podía especificar un rango o algo así. Pero esto es mucho menos común que especificar una IP.
Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: r1ghtz0 en Octubre 14, 2014, 02:36:34 am
La dirección del cliente es la del ordenador local, así que no hay que especificarla, porque ya la conocemos.

Esto en realidad es algo más complejo, porque un ordenador puede tener varias IPs (normalmente, como mínimo hay dos: la IP de localhost, 127.0.0.1, y una IP de red), y a veces es necesario especificar la IP que se quiere usar.

El puerto también se escoge automáticamente, aunque también creo recordar que se podía especificar un rango o algo así. Pero esto es mucho menos común que especificar una IP.

Ahora otra cosa que no comprendo que espero me puedas ayudar, es donde está server_addr.sin_addr.s_addr= htonl(INADDR_ANY), donde s_addr es un campo la estructura sin_addr que está dentro de server_addr.
 
La variable s_addr es de tipo unsigned long y por narices que tienes que ingresarle un valor como 223546200332, pero no, le ingresas una cosa como esta htonl(INADDR_ANY). Pero seamos onestos, esa chorrada no es un entero  long, así que cómo es posible que la variable s_addr permite que le ingresen eso. Ahora bien, si ingresaramos algo como 128.162.190.160 por pantalla, de qué forma esto se podría almacenar en la variable unsigned long s_addr?

Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: ravenheart en Octubre 14, 2014, 10:45:37 am
esa chorrada no es un entero  long, así que cómo es posible que la variable s_addr permite que le ingresen eso.
INADDR_ANY es un long. Y htonl es una función que recibe un long y devuelve otro long. Así que esa "chorrada", en efecto, es un long.

Citar
Ahora bien, si ingresaramos algo como 128.162.190.160 por pantalla, de qué forma esto se podría almacenar en la variable unsigned long s_addr?
Una IP son cuatro bytes, igual que un long. Solo hay que interpretar cada uno de ellos. Creo que hay una función que lo hace automáticamente, pero no recuerdo.

Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: r1ghtz0 en Octubre 14, 2014, 10:07:40 pm
Ok, ahora el código del cliente pide que ingreses la IP del servidor, cómo puedo saber la ip del servidor si coloque INADDR_ANY en el campo s_addr del servidor, y eso lo que hace es dejar que el SO le asigne una ip al servidor. También veo que el cliente declara un "char ip[16]" de 16 bytes para almacenar la ip del server cuando en realidad la ip ocupa 4 bytes (32 bits). Para rematar, tenemos la siguiente linea de código:

Código: C
  1. server.sin_addr.s_addr= inet_addr(ip);
  2.  

Viendo que la funcion inet_addr() es de esta manera:
Código: C
  1. in_addr_t inet_addr(const char *cp);
  2.  
Como el array ip se pasa a la función inet_addr() el puntero cp va apuntar al primer elemento de ip y también podrá apuntar a cada uno de los elementos de ip, así que la función inet_addr se la apañará para retornar la dirección ip, eso es lo que entiendo.

Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: darvein en Octubre 14, 2014, 11:01:43 pm
Exacto, inet_addr() hará magia por dentro para devolver una dirección de red válida de 32bits binarios:

http://linux.die.net/man/3/inet_addr
Citar
The inet_addr() function converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order. If the input is invalid, INADDR_NONE (usually -1) is returned. Use of this function is problematic because -1 is a valid address (255.255.255.255). Avoid its use in favor of inet_aton(), inet_pton(3), or getaddrinfo(3) which provide a cleaner way to indicate error return.
Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: r1ghtz0 en Octubre 16, 2014, 03:19:12 am
Yo lo que quiero saber es cual es la IP que el sistema operativo le asigna al server ¿Como puedo obtener esa IP del server? Y por qué el cliente almacena la IP del server en un array de 16 elemento? específicamente por qué el array es de 16 elementos? es todo.
Título: Re:[Ayuda] Programando socke cliente y servidor en C
Publicado por: r1ghtz0 en Octubre 16, 2014, 07:11:37 pm
El vector tiene 16 elementos porque la dirección IP puede tener hasta 15 caracteres. Y lo de la dirección IP del servidor y el cliente, también lo pude entender gracias a una ayuda que me dieron en otro foro, si el servidor y el cliente están en la misma PC entonces tomaran la misma dirección, es decir, 127.0.0.1. Si están en ordenadores de distintas partes del mundo entonces servidor y cliente tomarán la IP pública del ordenador  donde estén. Y si están en la misma red local entonces tomaran la IP de cada host de la red.