sockaddr_in - Extraiga IP de la conexión que escucha y acepta en la programación de socket en Linux en c
socket cliente-servidor en c linux (5)
En el siguiente código, me gustaría extraer la dirección IP del cliente conectado después de aceptar una conexión entrante. ¿Qué debo hacer después de accept()
para lograrlo?
int sockfd, newsockfd, portno, clilen;
portno = 8090;
clilen = 0;
pthread_t serverIn;
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("ERROR opening socket");
}
bzero((char *) & serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
serv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *) & serv_addr, sizeof (serv_addr)) < 0)
{
perror("ERROR on binding");
}
listen(sockfd, 5);
clilen = sizeof (cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) & cli_addr, &clilen);
Creo que getpeername()
no es necesario: la dirección del cliente ya está completa en cli_addr
mediante la llamada accept()
.
Solo necesita usar inet_ntop()
, getnameinfo()
o gethostbyaddr()
para imprimir u obtener más información.
La API se describe en las páginas del manual. Puede buscarlos desde la consola, comenzando con el man socket
y seguir las referencias a man getpeername
o usar Konqueror, que lo hace muy bien con los enlaces, si solicita la dirección #socket
. En mi caso en Kubuntu fue necesario instalar manpages-dev
package.
Puedes seguir este ejemplo:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
{
int s;
struct sockaddr_in peer;
int peer_len;
.
.
.
/* We must put the length in a variable. */
peer_len = sizeof(peer);
/* Ask getpeername to fill in peer''s socket address. */
if (getpeername(s, &peer, &peer_len) == -1) {
perror("getpeername() failed");
return -1;
}
/* Print it. The IP address is often zero because */
/* sockets are seldom bound to a specific local */
/* interface. */
printf("Peer''s IP address is: %s/n", inet_ntoa(peer.sin_addr));
printf("Peer''s port is: %d/n", (int) ntohs(peer.sin_port));
.
.
.
}
Su cli_addr
ya contiene la dirección IP y el puerto del cliente conectado después de que accept()
regresa con éxito, en el mismo formato que su variable serv_addr
. Use inet_ntop
para convertir IP en una cadena.