2017-08-11 182 views
0

我設法從特定請求的網絡適配器使用以下代碼獲取主機信息,但我不知道如何從主機IP地址獲取對端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 

回答

0

如果你是服務器監聽傳入連接,你可以從accept()得到同行的地址,在第二個它的參數,當一個新的socket時

accept()手冊頁:

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

參數addr是一個指向sockaddr結構的指針。正如通信層所知,此結構填充了對等套接字的地址。地址返回地址的確切格式取決於套接字的地址族(參見套接字(2)和相應的協議手冊頁)。當addr爲NULL時,不填充任何內容;在這種情況下,不使用addrlen,也應該爲NULL。

0

我不知道如何從主機IP地址獲取對端IP地址。

你不行。這個問題沒有意義。

要獲得對等地址,你必須有一個對等點,並有一個對等點,你必須有一個連接的套接字,你可以撥打getpeername()。或者,如果你是一個服務器,你可以通過第二個和第三個參數得到accept()的副作用。

0

我曾嘗試實施arp掃描以查找連接的客戶端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掃描所需要的信息是接口名稱和設備的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掃描平,我們會從客戶端獲得IP地址的響應。我正在使用這個arp-scan參考。