Làm cách nào để lấy địa chỉ IPv4 của giao diện trên Linux từ mã C? Ví dụ: Tôi muốn nhận địa chỉ IP (nếu có) được gán cho eth0.Nhận địa chỉ IP của giao diện trên Linux
Trả lời
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.
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.
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
Oh tuyệt vời, không bao giờ biết về điều này! –
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
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.
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"
- 1. Làm cách nào để đặt địa chỉ IP cho giao diện TUN trên OSX (không có địa chỉ đích)?
- 2. Nhận địa chỉ IP của người dùng
- 3. Cách lấy địa chỉ MAC của giao diện mạng WiFi?
- 4. Nhận địa chỉ IP cục bộ
- 5. C/C MAC++ Linux Địa chỉ của tất cả các giao diện
- 6. Scala Chơi Khung nhận của người dùng địa chỉ ip
- 7. Nhận địa chỉ IP của máy chủ trong ASP.NET?
- 8. Nhận địa chỉ ip wifi của tôi Android
- 9. Nhận địa chỉ IP của khách hàng ở Sinatra?
- 10. Cách nhận địa chỉ ip của khách hàng/người dùng?
- 11. SignalR Nhận địa chỉ IP của người gọi
- 12. Nhận địa chỉ IP của ứng dụng khách trong JSP
- 13. Đảo ngược ip, tìm tên miền trên địa chỉ IP
- 14. Địa chỉ MAC từ giao diện trên OS X (C)
- 15. Phát hiện địa chỉ IP wifi trên Android?
- 16. Python: Nhận địa chỉ IP cục bộ được sử dụng để gửi dữ liệu IP đến một địa chỉ IP từ xa cụ thể
- 17. Làm cách nào để biết địa chỉ IP cho giao diện trong C?
- 18. Cách nghe trên nhiều địa chỉ IP?
- 19. Scapy SYN gửi trên địa chỉ IP của chúng tôi
- 20. Vị trí địa lý dựa trên Địa chỉ IP - PHP
- 21. Tăng địa chỉ IP
- 22. TcpListener: Nghe trên mọi địa chỉ, bao gồm địa chỉ IP GPRS
- 23. Kết nối TCP/IP trên một giao diện cụ thể
- 24. Nhận địa chỉ MAC Ethernet của Android (không phải giao diện wifi)
- 25. Kịch bản để thay đổi địa chỉ IP trên windows
- 26. Địa chỉ IP từ sk_buff
- 27. Nhận địa chỉ IP bằng chuỗi URL? (Java)
- 28. Nhận địa chỉ IP công cộng (từ xa)
- 29. Nhận địa chỉ IP bằng cách sử dụng Action Script?
- 30. Làm cách nào để nhận địa chỉ IP?
lý do tại sao có lỗi phân đoạn? – user138126
Cung cấp lỗi phân đoạn –
'#include' bị thiếu cho 'close()' –
Angs