我设法使用下面的代码从特定请求的网络适配器获取主机信息,但我不知道如何从主机IP地址获取对等IP地址。
struct sockaddr_in *sa = (struct sockaddr_in *)&item->ifr_addr;
ipAddr = ntohl(*((u_int32_t *)&sa->sin_addr));
if (pIpAddr != NULL)
{
*pIpAddr = ipAddr;
}
// Get the MAC address
if ( ioctl(s, SIOCGIFHWADDR, item) < 0 )
{
printf("_GetMacAddress : SIOCGIFHWADDR failed!\n");
return 0;
}
else
{
struct sockaddr *eth = (struct sockaddr *) &item->ifr_ifru.ifru_hwaddr;
unsigned long *low = (unsigned long *)ð->sa_data[2];
unsigned short *high = (unsigned short*)ð->sa_data[0];
//printf("%s : MAC = 0x%04x, 0x%08x", ntohs(*high), ntohl(*low));
printf("Interface %8s : IP %3d.%3d.%3d.%3d : MAC = %02x:%02x:%02x:%02x:%02x:%02x\n",
item->ifr_name,
((ipAddr >> 24)&0xff), ((ipAddr >> 16)&0xff), ((ipAddr >> 8)&0xff), (ipAddr&0xff),
((ntohs(*high)>> 8)&0x00ff), (ntohs(*high)&0x00ff),
((ntohl(*low)>> 24)&0x00ff), ((ntohl(*low)>> 16)&0x00ff), ((ntohl(*low)>> 8)&0x00ff), (ntohl(*low)&0x00ff));
if ((pMacHigh != NULL) && (pMacLow != NULL))
{
*pMacHigh = *high;
*pMacLow = *low;
}
}
输出结果为:
_GetMaxNetworkInterfaces 3
Interface lo : IP 127. 0. 0. 1 : MAC = 00:00:00:00:00:00
Interface enp4s0 : IP 192.168.128. 88 : MAC = f4:8e:38:ea:88:23
Interface wlp5s0 : IP 192.168. 53. 63 : MAC = b8:81:98:b7:71:90
答案 0 :(得分:0)
如果您是服务器侦听传入连接,则可以在接受新套接字的第二个参数中从accept()
获取对等地址
来自accept()
的手册页:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数addr是一个指向sockaddr结构的指针。如通信层所知,该结构填充有对等套接字的地址。返回地址的确切格式由套接字的地址族决定(参见socket(2)和相应的协议手册页)。当addr为NULL时,不会填充任何内容;在这种情况下,不使用addrlen,也应该为NULL。
答案 1 :(得分:0)
我不知道如何从主机IP地址获取对等IP地址。
你做不到。这个问题没有意义。
要获得对等地址,您必须拥有对等体,并且要拥有对等体,您必须具有连接的套接字,您可以使用该套接字调用getpeername()
。
或者,如果您是服务器,则可以通过第二个和第三个参数将其作为accept()
的副作用。
答案 2 :(得分:0)
我确实试图实现arp-scan来查找连接的客户端IP地址。 首先,我们必须定义为我的案例连接的最大设备将是32.我设法从以前的代码中获取以下信息
Interface lo : IP 127. 0. 0. 1 : MAC = 00:00:00:00:00:00
Interface enp4s0 : IP 192.168.128. 88 : MAC = f4:8e:38:ea:88:23
Interface wlp5s0 : IP 192.168. 53. 63 : MAC = b8:81:98:b7:71:90
arp-scan需要的信息是接口名称和设备IP地址。为了获得客户端IP地址,我们必须在计算第三个点后删除该字符。我们得到的最终结果是:
127.0.0.
192.168.128.
192.168.53.
最后一步是循环使用max device
127.0.0.0~31
192.168.128.0~31
192.168.53.0~31
然后输入arp-scan ping,我们将从客户端IP地址获取响应。我正在使用此arp-scan引用。