Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[Sockets Windows] Saber Ip del Cliente

Estas en el tema de [Sockets Windows] Saber Ip del Cliente en el foro de C/C++ en Foros del Web. Hola! Tengo una duda respecto a la Ip del cliente que se conecta a mi server. La cosa, es que el otro dia empezé a ...
  #1 (permalink)  
Antiguo 22/06/2014, 11:42
 
Fecha de Ingreso: junio-2014
Mensajes: 8
Antigüedad: 9 años, 10 meses
Puntos: 0
[Sockets Windows] Saber Ip del Cliente

Hola!

Tengo una duda respecto a la Ip del cliente que se conecta a mi server.
La cosa, es que el otro dia empezé a buscar info para sacarla, y buscando encontre que se guarda en la estructura sockaddr en el accept de esta forma:

Cita:
sockaddr_in <estructura>;
accept(<socket del servidor>, (struct sockaddr*)&<en esta estructura>, NULL))
Pues bien, una vez hecho esto, en teoría había que cogerla de:
(llamamosle estr_sock a la estructura)

Cita:
estr_sock.sin_addr;
Para luego pasarla a una string (char *) de esta otra forma:

Cita:
char *aux;
aux = inet_ntoa(estr_sock);
Pues bien, el problema es que al imprimirlo por pantalla, la ip que me sale es "204.204.204.204" (lo imprimo por pantalla de esta forma):

Cita:
printf("Ip: %s \n",aux);
Por si preguntais, he probado hacerlo de forma local, y desde otra red wifi, y en los dos casos me sale el mismo número, no lo entiendo :S
  #2 (permalink)  
Antiguo 22/06/2014, 12:16
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: [Sockets Windows] Saber Ip del Cliente

inet_ntoa espera que le envies una struct in_addr, que es el campo 'sin_addr' de struct sockaddr_in, dicho de otra forma:

Código C:
Ver original
  1. printf("%s", inet_ntoa(estr_sock.sin_addr));

Con esto te deberia funcionar. Tambien tienes la funcion getpeername:

Código C:
Ver original
  1. SOCKADDR_IN client_info;
  2. memset(&client_info, 0, sizeof(client_info));
  3. getpeername(s_cliente, &client_info, sizeof(client_info));
  4. printf("%s", inet_ntoa(client_info.sin_addr));

Saludos
vosk
  #3 (permalink)  
Antiguo 22/06/2014, 12:27
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: [Sockets Windows] Saber Ip del Cliente

Una cosa esto de SOCKADDR_IN es el typedef de windows de struct sockaddr_in

Saludos
vosk
  #4 (permalink)  
Antiguo 22/06/2014, 13:35
 
Fecha de Ingreso: junio-2014
Mensajes: 8
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: [Sockets Windows] Saber Ip del Cliente

Muchas gracias por la respuesta!

Con tu segunda opción ya me imprime perfectamente la Ip. Pues nose que pasaba antes la verdad, lo tenia como tu primera opción. Muchas gracias de todas formas :)

vosk, si, se puede poner de las dos formas, es lo mismo ;)
  #5 (permalink)  
Antiguo 22/06/2014, 15:46
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: [Sockets Windows] Saber Ip del Cliente

"...vosk, si, se puede poner de las dos formas, es lo mismo ;)..."

Si? Ok, no estaba seguro y es bueno saberlo; no se porque tenia entendido que el struct sockaddr_in que recibes al momento de aceptar la conexion puede cambiar en algunos casos mientras el socket está abierto (no se cuales, y de echo no los he buscado), entonces si se diera el caso que esa estructura cambia puedes recuperarla en cualquier momento a traves del socket cliente con la funcion getpeername

Me alegro que te haya servido, y te agradezco que me aclares que las dos formas valen :)

Saludos
vosk

Etiquetas: cliente, int, ip, string, windows
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:11.