Как я могу получить IPv4-адрес клиента? - PullRequest
3 голосов
/ 22 марта 2010

Я готовлюсь к простому рабочему проекту и пытаюсь ознакомиться с основами сокетного программирования в среде 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.

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

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

Ответы [ 3 ]

4 голосов
/ 22 марта 2010

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

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

0 голосов
/ 23 марта 2010

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

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

0 голосов
/ 23 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...