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