Windows 无法在Visual C+;中设置UDP校验和覆盖率选项+;(2017)

Windows 无法在Visual C+;中设置UDP校验和覆盖率选项+;(2017),windows,visual-studio,visual-c++,udp,checksum,Windows,Visual Studio,Visual C++,Udp,Checksum,当我的代码到达setsockopt()行时,我得到WSA错误代码10022(无效参数): #包括 #包括 #包括 #pragma注释(lib,“Ws2_32.lib”) #pragma注释(lib,“Netapi32.lib”) int main(int argc,字符**argv) { 国际结果; DWORD OPT值=真; 插座; WSADATA wsa; //初始化winsock printf(“\n初始化Winsock…”); if(WSAStartup(MAKEWORD(2,2),&w

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

#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
#pragma注释(lib,“Netapi32.lib”)
int main(int argc,字符**argv)
{
国际结果;
DWORD OPT值=真;
插座;
WSADATA wsa;
//初始化winsock
printf(“\n初始化Winsock…”);
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
{
printf(“失败。错误代码:%d”,WSAGetLastError());
退出(退出失败);
}
printf(“已初始化。\n”);
//创建套接字
if((s=套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==套接字错误)
{
printf(“套接字()失败,错误代码:%d”,WSAGetLastError());
退出(退出失败);
}
//这条线坏了!
if(setsockopt(s,IPPROTO_UDP,UDP_CHECKSUM_COVERAGE,(const char*)和optValue,sizeof(optValue))=-1)
{
printf(“setsockopt失败,错误:%d\n”,WSAGetLastError());
退出(退出失败);
}
返回0;
}
这是我的代码的精简版本,因此可以轻松复制和运行


有人能告诉我我做错了什么吗?

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

但是,我不信任VC++2017,即使它在系统中的任何位置,所以下面的内容可能也帮不上忙

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

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

接下来是定义选项的级别-[in]级别。 IPPROTO_UDP看起来在识别套接字时起了作用。这似乎没问题,但它是可疑的,我建议检查一下,并验证它是否真的在工作

接下来是要为其设置值的optname-[in]套接字选项。 optname值必须是指定级别内定义的套接字选项,否则行为未定义。UDP_校验和_覆盖率可能需要按照IPPROTO_UDP的定义进行验证。我不信任Visual C++ 17。我建议你看看这个

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

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

如果您使用的是VisualStudio“Express”,那么其他一些依赖项可能无法工作

您可能会发现这很有趣:修复Mswsock.h问题

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

#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;
}