【问题标题】:setsockopt error WSAEADDRNOTAVAILsetsockopt 错误 WSAEADDRNOTAVAIL
【发布时间】:2012-11-13 08:34:18
【问题描述】:

来源:

WSADATA WSAData; 
SOCKET sock;
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) {
    printf("\nProblem with WSAStartup\n\n");
    return FALSE; 
}
if ((sock = WSASocket(AF_INET,SOCK_RAW,IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) {
    WSACleanup();
    printf("\nProblem with WSASocket\n\n");
    return FALSE;
}
int flag = 1;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag)) == SOCKET_ERROR) {
    printf("getsockopt failed with error: %u\n\n", WSAGetLastError());
    closesocket(sock);
    WSACleanup();
    return FALSE; 
}

每次我在我的程序中运行它时,我都会得到:

getsockopt failed with error: 10049

10049 是 WSAEADDRNOTAVAIL 的错误代码,意思是“请求的地址在其上下文中无效。”

请帮忙,我不知道为什么我不断收到此错误。

【问题讨论】:

  • 你编译成64位吗?
  • 我编译成win32,我想保持32而不是64。
  • 您使用的是哪个版本的windows、编译器和SDK?

标签: c++ c winapi sockets setsockopt


【解决方案1】:

您在调用WSASocket() 时指定了无效协议,尝试将IPPROTO_TCP 指定为:

WSASocket(AF_INET,SOCK_RAW,IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED)

【讨论】:

  • 您发布的代码在 VS 2010 调试模式下不会触发我的错误...所以参数和 API 的使用是正确的。你能发布完整的代码吗?
  • 我不能发布其余代码以解决安全问题(不是听起来很阴暗,哈哈),但其余代码不会因为没有任何变量或在这种情况下使用的任何我在这里没有提到的东西。我唯一能想到的是这段代码是从一个线程中获取的,它是从主程序中启动的。但是所有线程都正确完成,因为它在逻辑或语法上没有任何错误。
  • 我从 msdn 阅读了更多错误代码 10049,他们说“无法分配请求的地址。请求的地址在其上下文中无效。这通常是由于尝试绑定到对本地计算机无效的地址。”那么这可能是防火墙问题还是只是我的计算机问题?但我还应该注意,我在主程序的其他部分已经完美地连接和使用了其他套接字。
  • 是的,您的测试盒似乎有问题。你能建立一个测试工具来单独测试代码吗?你也可以在不同的机器上测试它......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2019-04-20
  • 1970-01-01
  • 2017-04-20
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多