C++ 如何获取fd_集中套接字的IP地址?

C++ 如何获取fd_集中套接字的IP地址?,c++,networking,winsock,C++,Networking,Winsock,嘿,我在一个fd_集中存储所有连接的插座。我想遍历套接字并显示IP地址 ZeroMemory(host, NI_MAXHOST); ZeroMemory(service, NI_MAXSERV); inet_ntop(AF_INET, &socketAddr.sin_addr, host, NI_MAXHOST); std::cout << host << " con

嘿,我在一个fd_集中存储所有连接的插座。我想遍历套接字并显示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;
                }
ZeroMemory(主机,NI_MAXHOST);
零内存(服务,NI_MAXSERV);
inet\u ntop(AF\u inet和socketAddr.sin\u addr、host、NI\u MAXHOST);

std::cout假设您对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");
      }
   }
}
#包括
#包括
#包括
#包括
//Offset是指向FD_集对象的指针
//maxFD是集合中最大的文件描述符值
无效打印客户端地址sinfdset(FD_SET*offset,int maxFD)
{

对于(int i=0;i假设您对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");
      }
   }
}
#包括
#包括
#包括
#包括
//Offset是指向FD_集对象的指针
//maxFD是集合中最大的文件描述符值
无效打印客户端地址sinfdset(FD_SET*offset,int maxFD)
{

对于(int i=0;是什么的IP地址。套接字绑定到的本地地址?还是套接字连接到的远程地址?对不起,是套接字连接到的远程地址。是什么的IP地址。是套接字绑定到的本地地址?还是套接字连接到的远程地址?对不起,是套接字连接到的远程地址to.当您说
FD_ISSET(i,fdset)
失败时是什么意思?您的意思是它返回false吗?如果是,那么
getpeername()
不应该因为
i
@D.haritehesan的值而被调用。您想如何决定调用
getpeername
的套接字?只需决定您想怎么做,然后在您选择调用它的套接字上调用
getpeername
。@D.haritehesan然后您应该维护一个受在向服务器添加/删除客户端时,使用互斥锁并从该列表中添加/删除客户端。然后,任何需要获取互斥锁的代码都可以获取该互斥锁并查看客户端列表。您无法避免这样一个事实,即您必须在某个地方有一个客户端列表。@DavidSchwartz仅当多个线程可能访问该列表时才需要使用互斥锁序列化;I d我看不出有任何迹象表明这里涉及多个线程。@JeremyFriesner True!那么我想知道为什么这会成为一个问题。保留一个客户端列表很简单,而且您已经需要它来填充FD_集了。您说的
FD_ISSET(I,fdset)是什么意思
失败了吗?你的意思是它返回false吗?如果是,那么
getpeername()
不应该因为
i
@D.haritehesan的值而被调用。您想如何决定调用
getpeername
的套接字?只需决定您想怎么做,然后在您选择调用它的套接字上调用
getpeername
。@D.haritehesan然后您应该维护一个受在向服务器添加/删除客户端时,使用互斥锁并从该列表中添加/删除客户端。然后,任何需要获取互斥锁的代码都可以获取该互斥锁并查看客户端列表。您无法避免这样一个事实,即您必须在某个地方有一个客户端列表。@DavidSchwartz仅当多个线程可能访问该列表时才需要使用互斥锁序列化;I d我看不出有任何迹象表明这里涉及多个线程。@JeremyFriesner True!那么我想知道为什么这会成为一个问题。保留一个客户端列表很简单,您已经需要它来填充FD_集了。