在使用套接字的Visual FoxPro应用程序中,我们使用wsock32.dll并使用htons()函数将端口号转换为TCP/IP网络字节顺序。它应该返回一个介于 0 和 65535 之间的无符号短线。使用端口 63333 进行测试时,它返回 26103,但在安装 Windows Fall Creators 更新后,它返回一个更大的值:16213495。
示例 FoxPro 程序:
DECLARE INTEGER htons IN "wsock32.dll" INTEGER hostshort
LOCAL portNumber, htonsNumber
portNumber = 63333
htonsNumber = htons( portNumber )
? htonsNumber
结果值应该进入 connect() 函数使用的"sockaddr"结构,但端口只有 2 个字节的空间。
有谁知道这个 Windows 更新到 wsock32 功能发生了什么和/或有解决这个问题的建议?
我将Windows10 FCU功能与Windows 8进行了比较,Windows重新排序了寄存器用法并保存了一个AND指令。这很可能是编译器优化,而不是源代码更改。因为左移的一半没有被屏蔽,所以你会得到16-23位的垃圾,但这些位应该被忽略。对于遵循Windows ABI的任何人,该函数仍然是正确的。
最佳解决方案是更新函数声明,使其使用 16 位整数类型。如果无法做到这一点,则可以在支持强制转换的语言中将数字转换为 16 位类型。最后一个选项是通过 AND 与0xffff
一起自己截断值:
htonsNumber = BitAnd(htons(portNumber), 0xffff)
SHORT 被列为有效的返回类型,因此也应该有效:
DECLARE SHORT htons IN "wsock32.dll" INTEGER