ICMPv6套接字无法创建

时间:2016-03-03 10:51:52

标签: c sockets ipv6 icmp

我正在尝试向远程网络发送ICMPV6消息,作为初始步骤,我尝试在包含SendICMPv6.c,{{1}的简单类(winsock2)中创建ICMPv6套接字。 },ws2tcpipstdio标题。但我无法创建套接字。有人可以帮忙吗?

代码是:

stdlib

有人能解决问题吗?

2 个答案:

答案 0 :(得分:2)

如果您仔细阅读documentation,则可以选择几个选项:

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

      

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

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

      

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

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

      

    如果没有错误发生,socket返回引用新套接字的描述符。否则,返回值INVALID_SOCKET,并且可以通过调用WSAGetLastError来检索特定的错误代码。

答案 1 :(得分:1)

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