Windows编译uftp时无法设置IP_PMTUDISC_DONT禁用MTU发现
解决Windows上uftp设置IP_PMTUDISC_DONT失败的问题
你碰到的错误10042其实是个典型的跨平台差异问题——Windows套接字完全不支持IP_PMTUDISC_DONT这个选项,它是Linux/Unix生态特有的MTU发现控制选项。下面是具体的修复方案,帮你在Windows上实现等价的功能:
1. 给代码加平台分支处理
找到你设置IP_PMTUDISC_DONT的代码块,用条件编译区分Windows和类Unix系统的逻辑:
#ifdef _WIN32 // Windows平台:用IP_DONTFRAGMENT实现等价的MTU发现禁用 BOOL dont_fragment = TRUE; if (setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAGMENT, (char*)&dont_fragment, sizeof(dont_fragment)) == SOCKET_ERROR) { fprintf(stderr, "错误禁用MTU发现: (%d) %s\n", WSAGetLastError(), strerror(WSAGetLastError())); exit(EXIT_FAILURE); } #else // 保留原有的Linux/Unix逻辑 int optval = IP_PMTUDISC_DONT; if (setsockopt(sockfd, IPPROTO_IP, IP_PMTUDISC, &optval, sizeof(optval)) == -1) { fprintf(stderr, "错误禁用MTU发现: %s\n", strerror(errno)); exit(EXIT_FAILURE); } #endif
2. 搞懂两者的行为差异
别担心,这个替换是等价的:
- 在Linux上,
IP_PMTUDISC_DONT会关闭路径MTU发现,直接发送数据包,超过MTU时要么分片(如果允许)要么丢弃。 - 在Windows上,UDP套接字默认就不会自动分片,设置
IP_DONTFRAGMENT为TRUE后,超过MTU的数据包会直接丢弃,和Linux下IP_PMTUDISC_DONT的核心行为完全一致。
3. 重新编译验证
保持你之前静态链接OpenSSL的编译参数,重新编译uftp,然后运行你的测试命令:
uftpd.exe -D C:\xfertest\ -p 1044 -d -T c:\tmp
这时候应该就不会再弹出10042的错误,MTU发现的禁用逻辑也能正常工作了。
内容的提问来源于stack exchange,提问作者digarok
相关产品推荐
相关产品推荐

