Как я могу получить IPv4-адрес клиента?

Я готовлю простой проект и стараюсь ознакомиться с основами программирования сокетов в среде Unix dev. На данный момент у меня есть базовая настройка кода на стороне сервера для прослушивания входящих запросов TCP-соединения от клиентов после создания родительского сокета и установки прослушивания...

int sockfd, newfd; 
unsigned int len;
socklen_t sin_size;
char msg[]="Test message sent";
char buf[MAXLEN];
int st, rv;
struct addrinfo hints, *serverinfo, *p; 
struct sockaddr_storage client;
char ip[INET6_ADDRSTRLEN];
.
. //parent socket creation and listen code omitted for simplicity
.
//wait for connection requests from clients
while(1)
 {
 //Returns the socketID and address of client connecting to socket
 if( ( newfd = accept(sockfd, (struct sockaddr *)&client, &len) ) == -1 ){
 perror("Accept");
 exit(-1);
 }
 if( (rv = recv(newfd, buf, MAXLEN-1, 0 )) == -1) {
 perror("Recv");
 exit(-1);
 }
 struct sockaddr_in *clientAddr = ( struct sockaddr_in *) get_in_addr((struct sockaddr *)&client);
 inet_ntop(client.ss_family, clientAddr, ip, sizeof ip);
 printf("Receive from %s: query type is %s\n", ip, buf);
 if( ( st = send(newfd, msg, strlen(msg), 0)) == -1 ) {
 perror("Send");
 exit(-1);
 }
 //ntohs is used to avoid big-endian and little endian compatibility issues
 printf("Send %d byte to port %d\n", ntohs(clientAddr->sin_port) );
 close(newfd);
 }
}

Я нашел функцию get_in_addr онлайн и поместил ее в начало моего кода и использовал ее для получения IP-адреса клиента, подключенного...

// get sockaddr, IPv4 or IPv6:
void *get_in_addr(struct sockaddr *sa)
{
 if (sa->sa_family == AF_INET) {
 return &(((struct sockaddr_in*)sa)->sin_addr);
 }
 return &(((struct sockaddr_in6*)sa)->sin6_addr);
}

но функция всегда возвращает IP-адрес IPv6, так как это свойство sa_family установлено как.

Мой вопрос в том, что IP-адрес IPv4 хранится где-нибудь в данных, которые я использую, и если да, то как я могу получить к нему доступ?

Большое спасибо за вашу помощь!

3 ответа

Если вы получаете IPv6-адрес, то то, что клиент использует для подключения. Между адресами IPv6 и IPv4 не существует соответствия 1-1, а также между IP-адресами и клиентскими устройствами.

Его немного похоже на то, что вы получили письмо от кого-то, но у вас возникли проблемы с составлением их почтового адреса с их адреса электронной почты.


Пока вы физически получаете IPv6-адрес, если клиент подключен к IPv4, адрес будет в IPv4-адресном формате адреса.

Вы можете извлечь часть IPv4 адреса, обратившись к байтам 12, 13, 14 и 15 из s6_addr.


См. Необходимость функции "getipv4addr" и "getipv6addr" на моем веб-сайте. В нем описано, как вы можете получить IPv4 или IPv6-адрес компьютера, на котором он запущен.

licensed under cc by-sa 3.0 with attribution.