Linux C程序员看穿外网 IP的迷雾(linuxc外网ip)
科技发展如此之快,我们身边已经有了许多高科技应用了。一直以来,穿越外网IP的迷雾一直是网络安全研究的一块重要课题,基于Linux系统的C程序可以帮助你看穿迷雾,获取到真实IP地址。
针对外网IP获取,C程序员有几种不同的方法和方案:
第一种方法是使用Epoll函数库,Epoll函数库是Linux系统提供的一种高效的事件处理机制,可以判断系统提交的新数据,并处理之。在查询外网IP时,可以使用Epoll函数库,使用fd_set函数集查找Socket,然后使用gethostbyaddr函数获取到对应的地址信息:
#include
#include
#include
#include
#include
int main()
{
char * host=”…”;
int s;
int epfd;
struct hostent *hp;
struct epoll_event ev;
//Obtain a socket for web
int s = socket(AF_INET,SOCK_STREAM,0);
if(s == -1)
{
printf(“Create socket failed!”);
}
//configuring nameservers
struct hostent * hp = gethostbyaddr(host, strlen(host), AF_INET);
//Create epoll instance
epfd = epoll_create1(0);
if(epfd== -1)
{
perror(“epoll_create1() error”);
exit(1);
}
//Add the socket to epoll instance
ev.data.fd = s;
err=epoll_ctl(epfd, EPOLL_CTL_ADD,s, &ev);
if (err ==-1)
{
perror(“epoll_ctl() error”);
exit(1);
}
printf(“Getting External IP: %d.%d.%d.%d\n”, hptr->h_name, ptr->h_addrtype, ptr->h_length);
//Close socket
close(s);
return 0;
}
其次,C程序员也可以使用API或者Socket网络编程技术来实现IP地址查找:在学习LinuxSocket编程时,主要通过调用gethostbyname函数来查找地址对应的IP地址:
#include
#include
#include
#include
int main()
{
char * hostname = “…”;
struct hostent*host_entry;
struct in_addr ipaddr;
int ret;
host_entry = gethostbyname(hostname);
ipaddr = *(struct in_addr *)(host_entry->h_addr);
printf(“%s: IP地址: %s\n”, hostname, inet_ntoa(ipaddr));
return 0;
}
同样,C程序员还可以调用getaddrinfo函数来获取对应地址的IP地址,这个函数比gethostbyname更加灵活,可以在IPV4和IPV6之间设置类型,使用方式如下:
#include
#include
#include
#include
#include
int main(){
struct addrinfo hints, *res;
struct in_addr addr;
int errcode;
char addrstr[100];
void *ptr;
//Getting IP address from hostname
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;
errcode = getaddrinfo(“www.example.com”, NULL, &hints, &res);
if (errcode != 0) {
printf(“getaddrinfo() failed: %s\n”, gai_strerror(errcode));
exit(1);
}
printf(“Host: %s\n”, res->ai_canonname);
ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
inet_ntop(res->ai_family, ptr, addrstr, 100);
printf(“IPv4 address: %s\n”, addrstr);
freeaddrinfo(res);
}
通过以上三种方式,Linux C程序完全可以穿透外网IP的迷雾,查询真实IP地址。然而,并不是所有的IP地址都可以直接被查询到,有时候需要经过几次跳转才能查询到真实的IP地址,这也是想要深入了解IP地址信息时,Linux C程序员必须要加强学习网络安全技术的原因吧。