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:#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void)
{
/* Abriendo socket */
int sockfd, new_sockfd;
struct sockaddr_in server_addr;
struct sockaddr_in cliente_addr;
int addrlen;
sockfd= socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1){
printf("Error abriendo el socket..."); }
/* Asociación de parámetros al socket */
server_addr.sin_family= AF_INET;
server_addr.sin_port= htons(1234);
server_addr.sin_addr.s_addr= htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr))==-1){
printf("\nError en bind()..."); }
/* Habilitamos el socket para recibir peticiones y establecer conexiones */
listen(sockfd, 5);
addrlen= sizeof(struct sockaddr);
/* Recibimos peticiones con accept() */
new_sockfd= accept(sockfd, (struct sockaddr *) &cliente_addr, &addrlen);
if(new_sockfd == -1){
printf("Error, no se pudo recibir petición correctamente"); }
return 0;
}
Cliente:#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void)
{
struct sockaddr_in server;
char ip[16];
int fd, puerto;
int addrlen;
printf("Ingrese la ip del servidor\n");
printf("Ingrese el puerto de conexión\n");
/* Abrimos el socket */
fd= socket(AF_INET, SOCK_STREAM, 0);
if(fd==-1){
printf("Error abriendo el socket"); return -1;
}
/* Definimos los datos del servidor */
server.sin_family= AF_INET;
server.sin_port= htons(1234);
server.sin_addr.s_addr= inet_addr(ip);
addrlen= sizeof(struct sockaddr);
if(connect(fd, (struct sockaddr *)&server, addrlen) == -1){
printf("\nHa ocurrido un error al conectarce al server"); }
return 0;
}
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:
server.sin_addr.s_addr= inet_addr(ip);
Viendo que la funcion inet_addr() es de esta manera:
in_addr_t inet_addr(const char *cp);
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.