绑定套接字到特定接口

时间:2016-06-21 23:28:54

标签: c sockets interface

我正在尝试将套接字绑定到特定(环回)接口lo,以防止外部流量干扰它:

int bind_socket(uint8_t *iface, uint8_t port) {
        int rv;
        struct sockaddr_in addr;
        rv = socket(AF_INET, SOCK_STREAM, 0);
        if (rv < 0) return -1;
        if (setsockopt(rv, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface)) < 0) {
                return -2;
        }
        bzero((char *) &addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(port);
        if (bind(rv, (struct sockaddr *) &addr, sizeof(addr)) < 0)
                return -3;
        return rv;
}

...

int ss;
ss = bind_socket("lo", 100);

但是,如果我运行nmap localhost -e wlpXsX,我不应该得到输出,表明套接字可通过该接口使用。相反,它被报告为可用;而我似乎无法推断出原因。为什么这个接口全局可用于一个旨在使其对所有其他接口不可用的程序?

2 个答案:

答案 0 :(得分:2)

您写道:

  

我正在尝试将套接字绑定到特定(环回)接口

但您编码:

addr.sin_addr.s_addr = INADDR_ANY;

INADDR_ANY(0.0.0.0)环回接口。您需要将其更改为INADDR_LOOPBACK(127.0.0.1):

addr.sin_addr.s_addr = htons(INADDR_LOOPBACK);

答案 1 :(得分:0)

似乎 osr = new StreamReader(ozipentry.Open(), Encoding.Default); scontents = osr.ReadToEnd(); 忽略了接口交换机,并且无论如何都将其探测器路由到环回接口。将我的LAN地址作为目标而不是nmap,并且我的LAN接口作为localhost的接口参数,使用以下源代码生成了对本地主机外部不可见的套接字的预期结果: / p>

nmap