【问题标题】:Get Peer IP Address and Port获取对等 IP 地址和端口
【发布时间】:2017-08-11 02:50:34
【问题描述】:

我设法使用下面的代码从特定请求的网络适配器获取主机信息,但我不知道如何从主机 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 *)&eth->sa_data[2];
        unsigned short *high = (unsigned short*)&eth->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

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    如果您正在服务器侦听传入连接,您可以从 accept() 获取对等地址,在第二个参数中,当接受新套接字时

    来自accept()的手册页:

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    

    参数 addr 是一个指向 sockaddr 结构的指针。这个结构用对等套接字的地址填充,如通信层所知。地址返回 addr 的确切格式由套接字的地址族确定(参见 socket(2) 和相应的协议手册页)。 addr为NULL时,不填任何内容;在这种情况下,不使用 addrlen,也应该为 NULL。

    【讨论】:

      【解决方案2】:

      我不知道如何从主机 IP 地址获取对等 IP 地址。

      你不能。这个问题没有意义。

      要获得对等地址,您必须有一个对等,并且要拥有一个对等,您必须有一个连接的套接字,您可以调用getpeername()

      或者,如果您是服务器,则可以通过第二个和第三个参数将其作为accept() 的副作用来获取。

      【讨论】:

        【解决方案3】:

        我确实尝试过执行 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.
        

        最后一步是循环最大设备

        127.0.0.0~31
        192.168.128.0~31
        192.168.53.0~31
        

        然后输入 arp-scan ping,我们将得到来自客户端 IP 地址的响应。我正在使用这个arp-scan 参考。

        【讨论】:

          猜你喜欢
          • 2014-12-29
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 2014-12-01
          • 2016-10-17
          • 1970-01-01
          • 1970-01-01
          • 2014-03-14
          相关资源
          最近更新 更多