【问题标题】:Microsoft .NET raw socket type of service fieldMicrosoft .NET 原始套接字类型的服务字段
【发布时间】:2013-10-08 18:42:13
【问题描述】:

我目前正在 VisualBasic.NET 中开发一个项目,并且正在使用原始套接字来构建我的数据包以通过套接字发送。这是因为我必须在 IP 数据包的标头中设置服务类型字段,这在现代版本的 Windows 中使用 Winsock 是不可能的。我不能使用 Diffserv,因为应用程序正在与之通信的嵌入式设备要求我使用完整的 TOS 字段。

当前的代码实现相当简单并且运行良好 - 但仅在 Windows 8 中运行。如果代码在任何其他 Windows 操作系统(XP 或 7)上运行,则 TOS 字段将被覆盖为 0 无论如何(它需要为我正在使用的设备设置为 2)。

我在整个互联网上寻找有关这方面的提示,并发现了一些注册表更改(我尝试了所有这些都无济于事)以及组策略编辑。其中大部分用于启用在 Winsock 中设置 TOS 字段的功能,该功能仅适用于 XP。

我被引导相信这个问题是由 Windows 操作系统的网络层设置的一些变化引起的,但很难准确指出发生了什么变化。

任何帮助将不胜感激。

【问题讨论】:

  • 作为更新,我们已经确定是显式拥塞通知被清零。当尝试更大的 TOS 值时,高位被设置,但低位被 Windows 清除。

标签: .net vb.net sockets


【解决方案1】:

经过大量调查,我们发现了几件事。

  • 您可以通过以下注册表更改在 Windows 8 中正确设置 TOS 字段:

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\QoS] "不要使用 NLA"="1"

  • 您可以在 XP 中使用 WinSock 正确设置 TOS 字段,方法是进行以下注册表更改:

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] "DisableUserTOSSetting"=dword:00000000

  • 您似乎无法更改 Windows 7 中的 TOS 字段。我们尝试了几种不同的代码变体和 Windows 7 版本,但均未成功。

我不能 100% 确定为什么上述陈述是正确的,但它们是我们在大约一个月内对各种不同机器和操作系统变体进行测试后发现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2011-05-07
    • 2011-05-10
    • 2016-08-01
    • 2015-01-20
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多