linux – SO_ATTACH_REUSEPORT_CBPF套接字选项意外行为

linux – SO_ATTACH_REUSEPORT_CBPF套接字选项意外行为,第1张

概述我正在尝试使用来自两个应用程序的端口,并让每个应用程序从一组不同的IP地址接收数据包.为了实现这一点,我使用了SO_REUSEPORT和SO_ATTACH_REUSEPORT_CBPF套接字选项.我的代码如下: parentfd = socket(AF_INET, SOCK_STREAM, 0);if (parentfd < 0) error( "ERROR opening socket") 我正在尝试使用来自两个应用程序的端口,并让每个应用程序从一组不同的IP地址接收数据包.为了实现这一点,我使用了SO_REUSEPORT和SO_ATTACH_REUSEPORT_CBPF套接字选项.我的代码如下:

parentfd = socket(AF_INET,SOCK_STREAM,0);if (parentfd < 0)  error( "ERROR opening socket");struct sock_filter code[]={  { 0x28,0x0000000c },{ 0x15,3,0x00000800 },{ 0x20,0x0000001a },2,0xc0a8ff01 },{ 0x6,0x00000000 },0x00040000 },0x00000001 },};struct sock_fprog bpf = {  .len = ARRAY_SIZE(code),.filter = code,};if (setsockopt(parentfd,Sol_SOCKET,SO_REUSEPORT,(const voID *)&optval,sizeof(optval)))  error("ERROR setting SO_REUSEPORT");if (setsockopt(parentfd,SO_ATTACH_REUSEPORT_CBPF,(const voID *)&bpf,sizeof(bpf)))  error("ERROR setting SO_ATTACH_REUSEPORT_CBPF);

我还有一个不同的进程只使用SO_REUSEPORT标志来侦听同一个端口.从IP 192.168.255.1的机器上运行echo 1234 | ncat 192.168.255.150 1234.基于我的过滤器,我希望第二个进程可以接收来自该IP地址的所有流量.然而,它都是第一个收到的.当我将过滤器更改为简单时:

struct sock_filter code [] = {
  {0x6,0×00000001},
};

它按预期工作,所有数据包都由第二个进程接收.知道为什么会这样吗?

解决方法 我发现了问题所在.过滤器应用于所有数据包,甚至是TCP握手数据包.此外,基指针指向数据包有效负载的第一个字节,而不是标头.因此,当它执行时

ldh[12]

它超出了数据包的限制(SYN数据包有0字节的有效负载),默认行为是返回0.

总结

以上是内存溢出为你收集整理的linux – SO_ATTACH_REUSEPORT_CBPF套接字选项意外行为全部内容,希望文章能够帮你解决linux – SO_ATTACH_REUSEPORT_CBPF套接字选项意外行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1029706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存