Windows 无法在Visual C+;中设置UDP校验和覆盖率选项+;(2017)
当我的代码到达setsockopt()行时,我得到WSA错误代码10022(无效参数):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
#包括
#包括
#包括
#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;
}