Netty 3.9 setTrafficClass()方法似乎确实有效

Netty 3.9 setTrafficClass()方法似乎确实有效,netty,Netty,我正在使用Netty 3.9.5,并使用了本页列出的代码:构建一个简单的服务器程序和客户端程序。我的两台机器都是Windows7,我使用的是JDK1.8。这些程序运行良好 我当前的项目要求我为从客户端发送到服务器的数据包设置DSCP代码。下面是我添加到Netty客户端示例中的相关代码 Channel comLink = connection.getChannel(); /* Hopefully this will set the traffic class in the cha

我正在使用Netty 3.9.5,并使用了本页列出的代码:构建一个简单的服务器程序和客户端程序。我的两台机器都是Windows7,我使用的是JDK1.8。这些程序运行良好

我当前的项目要求我为从客户端发送到服务器的数据包设置DSCP代码。下面是我添加到Netty客户端示例中的相关代码

    Channel comLink = connection.getChannel();

    /* Hopefully this will set the traffic class in the channel. */

    SocketChannelConfig cfg = (NioSocketChannelConfig) comLink.getConfig();
    cfg.setTrafficClass(0x08);
//  cfg.setOption("trafficClass", 8);
    System.out.println("The traffic class is " + cfg.getTrafficClass());
无论我使用setTrafficClass还是setOption。始终打印的值为0。此外,客户端和服务器上的Wireshark显示0

我还有别的事要做吗?我的最终目标是让程序在Windows和Ubuntu下运行。我看过一些关于使用java.net.Socket时setTrafficClass出现问题的Windows文章,但我不知道这是否有任何关系

我假设有一些我不理解的事情,如果能在正确的方向上提供帮助或指导,我将不胜感激

多谢各位


Phil

我不确定,但根据Socket类的Java文档:

正如RFC 1122第4.2.4.2节所述,符合要求的TCP实现 应该(但不是必须)让应用程序更改TOS字段 在连接的生存期内。那么服务的类型 可以在TCP连接建立后更改字段 取决于底层平台中的实现。应用 不应假设他们可以在测试后更改TOS字段 连接

因此,我认为您应该在创建通道之前将其放置,因此在引导过程中,您可能需要执行以下操作:

ClientBootstrap bootstrap = ...
bootstrap.setOption("trafficClass", 0x08);
和/或

ServerBootstrap bootstrap = ...
boostrap.setOption("trafficClass", 0x08);//not sure for this one but cost nothing
bootstrap.setOption("child.trafficClass", 0x08);
显然,无法保证在连接后设置值。
您可以尝试…

在引导上同时设置父项和子项对您有效吗?添加到引导无效。有效的方法是在我输入时留下代码,并添加vm属性-Djava.net.preferIPv4Stack=true似乎是一个JDK错误,而不是Netty: