2010-02-17 44 views

Trả lời

65

Hãy thử điều này:

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> /* for strncpy */ 

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <netinet/in.h> 
#include <net/if.h> 
#include <arpa/inet.h> 

int 
main() 
{ 
int fd; 
struct ifreq ifr; 

fd = socket(AF_INET, SOCK_DGRAM, 0); 

/* I want to get an IPv4 IP address */ 
ifr.ifr_addr.sa_family = AF_INET; 

/* I want IP address attached to "eth0" */ 
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); 

ioctl(fd, SIOCGIFADDR, &ifr); 

close(fd); 

/* display result */ 
printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 

return 0; 
} 

Các mẫu mã được lấy từ here.

+1

lý do tại sao có lỗi phân đoạn? – user138126

+1

Cung cấp lỗi phân đoạn –

+0

'#include ' bị thiếu cho 'close()' – Angs

33

Ngoài phương pháp ioctl() Filip đã chứng minh bạn có thể sử dụng getifaddrs(). Có một chương trình ví dụ ở dưới cùng của trang người đàn ông.

+1

getifaddrs có vẻ rất toàn diện. Các phương thức khác sẽ chỉ cung cấp địa chỉ chính hoặc địa chỉ đầu tiên cho mỗi giao diện. – MarkR

+1

Oh tuyệt vời, không bao giờ biết về điều này! –

+0

Tôi không có bất kỳ kết nối trên eth0, nếu tôi sử dụng phương pháp khác nó kết quả đầu ra 128.226.115.183 đó là sai. Tuy nhiên, phương pháp này cho thấy rằng không có kết nối trên eth0 cung cấp một đầu ra đáng tin cậy – Angs

18

Nếu bạn đang tìm kiếm một địa chỉ (IPv4) của giao diện cụ thể nói wlan0 sau đó thử mã này trong đó sử dụng getifaddrs():

#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <ifaddrs.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
int main(int argc, char *argv[]) 
{ 
    struct ifaddrs *ifaddr, *ifa; 
    int family, s; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) 
    { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 


    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
    { 
     if (ifa->ifa_addr == NULL) 
      continue; 

     s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 

     if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET)) 
     { 
      if (s != 0) 
      { 
       printf("getnameinfo() failed: %s\n", gai_strerror(s)); 
       exit(EXIT_FAILURE); 
      } 
      printf("\tInterface : <%s>\n",ifa->ifa_name); 
      printf("\t Address : <%s>\n", host); 
     } 
    } 

    freeifaddrs(ifaddr); 
    exit(EXIT_SUCCESS); 
} 

Bạn có thể thay wlan0 với eth0 cho ethernet và lo cho lặp lại cục bộ.

Cấu trúc và giải thích chi tiết về cấu trúc dữ liệu sử dụng có thể được tìm thấy here.

Để biết thêm về danh sách được liên kết trong C, page này sẽ là điểm khởi đầu tốt.

+0

@nhahtdh: trông giống như bạn đã chỉnh sửa đoạn mã. sẽ tốt nếu bạn nhận xét thay đổi bạn đã thực hiện !! – sjsam

+0

Kiểm tra bản sửa đổi: Tôi chỉ chặn lại mã của bạn. – nhahtdh

+0

Thật tuyệt vời !! Cheerz thân yêu .. – sjsam

1

My 2 cents: cùng mã hoạt động ngay cả iOS:

#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <ifaddrs.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 



#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    showIP(); 
} 



void showIP() 
{ 
    struct ifaddrs *ifaddr, *ifa; 
    int family, s; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) 
    { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 


    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
    { 
     if (ifa->ifa_addr == NULL) 
      continue; 

     s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 

     if(/*(strcmp(ifa->ifa_name,"wlan0")==0)&&(*/ ifa->ifa_addr->sa_family==AF_INET) //) 
     { 
      if (s != 0) 
      { 
       printf("getnameinfo() failed: %s\n", gai_strerror(s)); 
       exit(EXIT_FAILURE); 
      } 
      printf("\tInterface : <%s>\n",ifa->ifa_name); 
      printf("\t Address : <%s>\n", host); 
     } 
    } 

    freeifaddrs(ifaddr); 
} 


@end 

Tôi chỉ đơn giản là loại bỏ các thử nghiệm chống lại wlan0 để xem dữ liệu. ps Bạn có thể xóa "gia đình"

Các vấn đề liên quan