如何获取 fd_set 中套接字的 IP 地址?
How to fetch an IP address of a socket inside a fd_set?
嘿,我将所有连接的套接字存储在 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 中已有的套接字时,这似乎不起作用。我是套接字编程的新手,将不胜感激任何帮助。
编辑:套接字连接到的远程地址
假设您对 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
。
嘿,我将所有连接的套接字存储在 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 中已有的套接字时,这似乎不起作用。我是套接字编程的新手,将不胜感激任何帮助。
编辑:套接字连接到的远程地址
假设您对 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
。