常见获取IP主要有几种方式:
1. 使用主机名获取本机IP,但是当主机名为空时,获取IP会失败。
2. 使用网卡信息获取本机IP
但是这几种方式在多网卡时候无法确定出口的IP,在<UNP> 8.14中介绍了使用UDP connect来确定外出接口。
源码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> void get_local_ip () { int fd = socket (AF_INET, SOCK_DGRAM, 0); int ret; socklen_t len = sizeof (struct sockaddr); struct sockaddr_in saddr; struct sockaddr_in name; if (fd == -1) { printf ("Socket create fail.\n"); return; } /* Fake server. */ memset (&saddr, 0, sizeof (struct sockaddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons (1234); inet_aton ("8.8.8.8", &saddr.sin_addr); ret = connect (fd, (struct sockaddr *)&saddr, len); if (ret == -1) { printf ("Connect fail.\n"); goto out; } ret = getsockname (fd, (struct sockaddr *)&name, &len); if (ret == -1) { printf ("Get socket name fail.\n"); goto out; } printf ("Local IP : %s\n", inet_ntoa (name.sin_addr)); out: close (fd); return; } int main () { get_local_ip (); return 0; }在get_local_ip中,connect到一个伪造的服务器IP和端口上,再通过getsockname获取这个FD的源IP和源端口。
UDP的connect的时候,会去查询静态路由表,填写相应的源IP和源端口。