无法为 enp4s0 上的套接字设置 SO_BINDTODEVICE
Can't set SO_BINDTODEVICE for a socket on enp4s0
我有一个用于 linux (ubuntu 16.04) 的旧代码 运行,它绑定到一个套接字并设置 SO_BINDTODEVICE、
setsockopt(sout, SOL_SOCKET, SO_BINDTODEVICE,"enp4s0", 4);
我已将目标更改为新的 Ubuntu 17.10,但它因错误 "No such device" 而失败,我已在该目标中使用循环进行了测试返回 '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
它在除 lo 之外的所有接口中都失败。
我怀疑设备名称的长度,所以我在 17.04 中进行了测试,名称 "eno0" 有效,但 wlp5s0 (wifi) 无效。
不知道怎么解决。你?长度有限制吗?
它不适用于更长的名称长度,因为您传递的长度错误。
setsockopt
的最后一个参数指定作为第四个参数传递的选项值的长度。您为此选项传递的值为 4,因此只会查看字符串的前 4 个字节。
将最后一个参数更改为字符串的长度:
setsockopt(sout, SOL_SOCKET, SO_BINDTODEVICE,"enp4s0", strlen("enp4s0"));
我有一个用于 linux (ubuntu 16.04) 的旧代码 运行,它绑定到一个套接字并设置 SO_BINDTODEVICE、
setsockopt(sout, SOL_SOCKET, SO_BINDTODEVICE,"enp4s0", 4);
我已将目标更改为新的 Ubuntu 17.10,但它因错误 "No such device" 而失败,我已在该目标中使用循环进行了测试返回 '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
它在除 lo 之外的所有接口中都失败。
我怀疑设备名称的长度,所以我在 17.04 中进行了测试,名称 "eno0" 有效,但 wlp5s0 (wifi) 无效。
不知道怎么解决。你?长度有限制吗?
它不适用于更长的名称长度,因为您传递的长度错误。
setsockopt
的最后一个参数指定作为第四个参数传递的选项值的长度。您为此选项传递的值为 4,因此只会查看字符串的前 4 个字节。
将最后一个参数更改为字符串的长度:
setsockopt(sout, SOL_SOCKET, SO_BINDTODEVICE,"enp4s0", strlen("enp4s0"));