如何在fd_set中获取套接字的IP地址?

问题描述 投票:0回答:1

嘿我将所有连接的套接字存储在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中已有的套接字时,这似乎不起作用。我是套接字编程的新手,非常感谢任何帮助。

编辑:套接字连接的远程地址

c++ networking winsock
1个回答
2
投票

假设您对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

© www.soinside.com 2019 - 2024. All rights reserved.