Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ICMPv6套接字创建失败_C_Sockets_Ipv6_Icmp - Fatal编程技术网

ICMPv6套接字创建失败

ICMPv6套接字创建失败,c,sockets,ipv6,icmp,C,Sockets,Ipv6,Icmp,我尝试向远程网络发送ICMPV6消息,作为第一步,我尝试在一个简单类(SendICMPv6.c)中创建ICMPV6套接字,该类包含winsock2、WS2TCIP、stdio和stdlib头。但我无法创建套接字。有人能帮忙吗?怎么了 代码是: WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { wprintf(L"WSAStartup f

我尝试向远程网络发送ICMPV6消息,作为第一步,我尝试在一个简单类(
SendICMPv6.c
)中创建ICMPV6套接字,该类包含
winsock2
WS2TCIP
stdio
stdlib
头。但我无法创建套接字。有人能帮忙吗?怎么了

代码是:

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");
    }
WSADATA-WSADATA;
int-iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=0){
wprintf(L“WSAStartup失败:%d\n”,iResult);
返回1;
}
int fd=插座(AF_INET6、SOCK_RAW、IPPROTO_ICMPV6);
如果(fd<0){
perror(“创建套接字失败”);
}
有人能解决这个问题吗?

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

  • 您的操作系统能否创建
    SOCK\u RAW
    sockets

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

  • 您是否以管理员身份运行

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

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

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

    如果仔细阅读,您可以检查以下几个选项:

  • 您的操作系统能否创建
    SOCK\u RAW
    sockets

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

  • 您是否以管理员身份运行

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

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

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


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

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

    @aribeiro代码不起作用,因此在代码评审时可能会偏离主题。@Pimgd,对不起,我的错@coredump:OP提到了winsock,这意味着代码在Windows上运行,Windows没有
    errno
    ,您必须使用
    WSAGetLastError()
    。@aribeiro代码不工作,因此在代码复查时它将脱离主题。@Pimgd,对不起,我的错@coredump:OP提到了winsock,这意味着代码在Windows上运行,Windows没有
    errno
    ,您必须使用
    WSAGetLastError()