Как получить IP-адрес сокета внутри fd_set? - PullRequest
0 голосов
/ 22 марта 2019

Привет, я храню все подключенные сокеты в fd_set.Я хочу перебрать сокеты и отобразить IP-адрес.

ZeroMemory(host, NI_MAXHOST);
                ZeroMemory(service, NI_MAXSERV);

                inet_ntop(AF_INET, &socketAddr.sin_addr, host, NI_MAXHOST);
                std::cout << host << " connected on port " << ntohs(socketAddr.sin_port) << std::endl;

                if (getnameinfo((sockaddr*)&socketAddr, sizeof(socketAddr), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {
                    std::cout << host << " connected on port " << service << std::endl;
                }
                else {
                    inet_ntop(AF_INET, &socketAddr.sin_addr, host, NI_MAXHOST);
                    std::cout << host << " connected on port " << ntohs(socketAddr.sin_port) << std::endl;
                }

Я использую этот способ для отображения информации, когда присоединяется новый клиент, но, похоже, это не работает при переборе сокетов уже в fd_set.Я новичок в программировании сокетов, и любая помощь будет принята с благодарностью.

Редактировать: удаленный адрес, к которому подключен сокет

1 Ответ

2 голосов
/ 22 марта 2019

Если вас интересует IPv4 и IP-адрес подключающегося клиента (в отличие от IP-адреса на стороне сервера), это должно работать:

#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

// theFDSet is a pointer to your FD_SET object
// maxFD is the largest file-descriptor value in the set
void PrintClientAddressesInFDSet(FD_SET * theFDSet, int maxFD)
{
   for (int i=0; i<=maxFD; i++)
   {
      if (FD_ISSET(i, theFDSet))
      {
         struct sockaddr_in addr;
         socklen_t length = sizeof(sockaddr_in);
         if (getpeername(i, (struct sockaddr *)&addr, &length) == 0)
         {
            printf("Socket FD %i is connected to a peer at IP address %s\n", i, inet_ntoa(addr.sin_addr));
         }
         else perror("getpeername");
      }
   }
}

Для IPv6 вам нужно будет использовать inet_ntop() вместо inet_ntoa() и sockaddr_in6 вместо sockaddr.

...