无法为enp4s0上的套接字设置SO_BINDTODEVICE

时间:2017-12-09 15:07:50

标签: c linux sockets clang multicastsocket

我有一个运行linux(ubuntu 16.04)的旧代码绑定到套接字并设置SO_BINDTODEVICE,

setsockopt(sout, SOL_SOCKET, SO_BINDTODEVICE,"enp4s0", 4);

我已将目标更改为新的Ubuntu 17.10,但它失败并显示错误“没有这样的设备”,我已使用循环返回'lo'界面测试了此目标,并且它可以正常工作。

接口已启用多播标志

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0a:cd:21:ac:2a brd ff:ff:ff:ff:ff:ff
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 30:9c:23:1c:b9:08 brd ff:ff:ff:ff:ff:ff
4: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 30:9c:23:1c:b9:09 brd ff:ff:ff:ff:ff:ff
22: macvtap0@enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 500
    link/ether 52:54:00:e4:5a:f8 brd ff:ff:ff:ff:ff:ff
23: macvtap1@enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 500
    link/ether 52:54:00:a0:93:d0 brd ff:ff:ff:ff:ff:ff

它在所有界面都失败了,但是很少。

我怀疑设备名称的长度,所以我在17.04测试并且名称为“eno0”,但是wlp5s0(wifi)没有。

我不知道如何解决。你呢?长度有限制吗?

1 个答案:

答案 0 :(得分:1)

由于你的传球时间过长,所以不能使用更长的名字。

setsockopt的最后一个参数指定作为第四个参数传递的选项值的长度。您为此选项传入的值为4,因此只查看字符串的前4个字节。

将最后一个参数更改为字符串的长度:

setsockopt(sout, SOL_SOCKET, SO_BINDTODEVICE,"enp4s0", strlen("enp4s0"));