You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:07:05