【问题标题】:ICMPv6 socket failed to createICMPv6 套接字创建失败
【发布时间】:2016-03-03 10:51:52
【问题描述】:

我正在尝试向远程网络发送 ICMPV6 消息,作为第一步,我尝试在一个简单的类 (SendICMPv6.c) 中创建一个 ICMPv6 套接字,其中包含 winsock2ws2tcpipstdiostdlib 标头。但我无法创建套接字。有人可以帮忙看看有什么问题吗?

代码是:

WSADATA  wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }
int fd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
    if (fd < 0) {
        perror("creating socket failed");
    }

有人能解决问题吗?

【问题讨论】:

  • @aribeiro 代码不起作用,因此它将在代码审查中偏离主题。
  • @Pimgd,对不起,我的错!
  • @coredump:OP提到winsock,意思是代码运行在windows上,没有errno,你得用WSAGetLastError()代替。

标签: c sockets ipv6 icmp


【解决方案1】:

如果您仔细阅读documentation,您可以检查的选项很少:

  1. 您的操作系统可以创建SOCK_RAW 套接字吗?

    如果 Winsock 服务提供者支持 AF_INET 或 AF_INET6 地址系列的 SOCK_RAW 套接字,则 SOCK_RAW 的套接字类型应包含在由一个或多个可用传输提供者的WSAEnumProtocols 函数返回的 WSAPROTOCOL_INFO 结构中。

  2. 您是否以管理员身份运行?

    因此,只有管理员组的成员才能在 Windows 2000 及更高版本上创建 SOCK_RAW 类型的套接字。

您需要在代码中添加更多错误检查。例如,如果socket() 失败:

如果没有发生错误,socket 返回一个引用新套接字的描述符。否则返回INVALID_SOCKET值,调用WSAGetLastError可以得到具体的错误码。

【讨论】:

    【解决方案2】:

    SOCK_RAW 需要管理员权限。您的应用是否在提升状态下运行?

    socket()失败时,使用WSAGetLastError()找出原因,例如:

    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }
    
    SOCKET fd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
    if (fd == INVALID_SOCKET) {
        printf("creating socket failed: %d\n", WSAGetLastError());
        return 1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多