微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在Visual C ++2017中设置UDP_CHECKSUM_COVERAGE选项

如何解决无法在Visual C ++2017中设置UDP_CHECKSUM_COVERAGE选项

当我的代码到达setsockopt()行时,我得到WSA错误代码10022(无效参数):

#include <ws2tcpip.h>
#include <MSWSock.h>
#include <stdio.h>

#pragma comment(lib,"Ws2_32.lib")
#pragma comment(lib,"Netapi32.lib")

int main(int argc,char** argv)
{
    int iResult;
    DWORD optValue = TRUE;

    SOCKET s;
    WSADATA wsa;

    //Initialise winsock
    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    printf("Initialised.\n");

    //create socket
    if ((s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) == SOCKET_ERROR)
    {
        printf("socket() Failed with error code : %d",WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    // THIS LINE FAILS!
    if (setsockopt(s,IPPROTO_UDP,UDP_CHECKSUM_COVERAGE,(const char *)&optValue,sizeof(optValue)) == -1)
    {
        printf("setsockopt Failed with error: %d\n",WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    return 0;
}

这是我的代码的精简版,因此可以轻松复制和运行。

有人可以告诉我我在做什么错吗?

解决方法

看起来您没有正确创建套接字。

但是,我不信任 VC++2017,即使在系统上的任何地方都有它,所以以下内容可能无济于事。

winsocks 可能非常无情。我建议您验证所有代码是否正确完成。

首先是标识套接字的 s - [in] 描述符。 看起来没问题。

接下来是级别 - [in] 定义选项的级别。 IPPROTO_UDP 看起来像是用来识别套接字。这看起来没问题,但很可疑,我建议检查一下并验证它是否确实有效。

接下来是 optname - [in] 要为其设置值的套接字选项。 optname 值必须是在指定级别内定义的套接字选项,否则行为未定义。 UDP_CHECKSUM_COVERAGE 可能需要按照 IPPROTO_UDP 的定义进行验证。我不相信 Visual C++ 17。我建议你检查一下。

接下来是 optval - [in] 指向指定请求选项值的缓冲区的指针。 (const char *)&optValue 。那行得通吗?在使用 setsockopt 之前先设置这个怎么样?如何在使用之前验证 this 不是 null 或 nullptr 并且它确实存在?

接下来是 optlen - [in] optval 缓冲区的大小,以字节为单位。 同样,这是 VC++2017,您可能需要在使用 setsockopt 之前先设置它。然后在使用前验证它是否设置为正确的大小。

如果您使用的是 Visual Studio“Express”,那么某些依赖项可能无法正常工作。

您可能会发现这很有趣:修复 Mswsock.h 问题 https://www.exefiles.com/en/h/mswsock-h/

最后但并非最不重要的尝试添加 #include 有和没有 Mswsock.h

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。