我正在尝试在Windows上构建UFTP。这是UDP传输客户端/服务器。
我最终能够用openssl链接的静态二进制文件。但是,我仍然有一个代码的问题。它无法在套接字上设置IP_PMTUDISC_DONT标志。
运行代码窗口错误时:
> uftpd.exe -D C:xfertest -p 1044 -d -T c:tmp
Error disabling MTU discovery: (10042) An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call.
Error leaving multicast group: (10038) An operation was attempted on something that is not a socket.
这是试图在client_init.c中设置标志的代码:
#ifdef IP_MTU_DISCOVER
{
int mtuflag = IP_PMTUDISC_DONT;
if (setsockopt(listener, IPPROTO_IP, IP_MTU_DISCOVER, &mtuflag, sizeof(mtuflag)) == SOCKET_ERROR) {
sockerror(0, 0, 0, "Error disabling MTU discovery");
closesocket(listener);
exit(ERR_SOCKET);
}
}
#endif
这是在Windows Server 2016上使用VS2017 Community Edition构建的。
我尝试了不包括此标志的测试构建,但它们的性能似乎差得多(大量的NAKS(,如果这会导致碎片化,这也许不足为奇。
谁能想到为什么我不能在此上设置Sockopt((?侦听器确实是listener = socket(family, SOCK_DGRAM, 0)
在同一文件中创建的插座。我看到互联网上的其他反馈声称其中一些API可能随着时间的流逝而发生了变化。我会看看我是否可以基于较早的VS和OS版本,但是我希望有人以前击中此问题的人能指出一个明确的解决方案的途径。
对IP_MTU_DISCOVER
的支持根本不存在于Windows Server 2016中。
IP_MTU_DISCOVER
在Windows 10 Build 15002中的UDP插座的WSL(Linux的Windows子系统(中实现(请参见WSL问题#69,#170,#717,#717和GitHub上的#720(:
https://learn.microsoft.com/en-us/windows/wsl/release-notes-notes#build-15002
实现的IP_MTU_DISCOVER INET套接字选项(GH#720,717,170,69(
IP_MTU_DISCOVER
在Windows 10 Build 16215中的WSL中用于TCP插座(请参阅GitHub上的WSL问题#1639,#2115和#2205(:
https://learn.microsoft.com/en-us/windows/wsl/release-notes#build-16215
添加了对TCP插座的IP_MTU_Discover的支持。[GH 1639,2115,2205]
仅仅因为预处理器具有#define
'D IP_MTU_DISCOVER
的值不能保证 target OS 您的代码最终运行实际上支持IP_MTU_DISCOVER
。您需要运行代码并忽略WSAENOPROTOOPT
的setsockopt()
错误,例如:
#ifdef IP_MTU_DISCOVER
{
int mtuflag = IP_PMTUDISC_DONT;
if (setsockopt(listener, IPPROTO_IP, IP_MTU_DISCOVER, &mtuflag, sizeof(mtuflag)) == SOCKET_ERROR) {
if (WSAGetLastError() != WSAENOPROTOOPT) {
sockerror(0, 0, 0, "Error disabling MTU discovery");
closesocket(listener);
exit(ERR_SOCKET);
}
// IP_MTU_DISCOVER is NOT supported on this OS!
// Do something else, or just move on...
}
}
#endif