使用UDP的connect获取本机IP

常见获取IP主要有几种方式:

1. 使用主机名获取本机IP,但是当主机名为空时,获取IP会失败。

2. 使用网卡信息获取本机IP

但是这几种方式在多网卡时候无法确定出口的IP,在 8.14中介绍了使用UDP connect来确定外出接口。

源码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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和源端口。

你可能感兴趣的:(东搞西搞)