2016-03-03 3 views
0

Я пытаюсь отправить сообщение ICMPv6 к удаленной сети, в качестве первого шага я попытался создать сокет ICMPv6 в простом классе (SendICMPv6.c), который содержит заголовки в winsock2, ws2tcpip, stdio и stdlib. Но я не могу создать сокет. Может ли кто-нибудь помочь Что случилось?ICMPv6 сокет не удалось создать

Код:

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

Может кто-то выяснить эту проблему?

+1

, что это 'errno'? – coredump

+3

@aribeiro код не работает, и, таким образом, он будет не по теме в Code Review. – Pimgd

+0

@Pimgd, извините, мой плохой! – aribeiro

ответ

2

Если вы внимательно читали documentation, есть несколько вариантов, вы можете проверить:

  1. Может ли ваша OS создать SOCK_RAW сокетов?

    Если поставщик услуг поддерживает Winsock SOCK_RAW гнезда для AF_INET или AF_INET6 семейств адресов, тип разъема SOCK_RAW должен быть включен в WSAPROTOCOL_INFO структуре, возвращаемой функцией WSAEnumProtocols для одного или нескольких доступных поставщиков транспорта.

  2. Вы работаете в качестве администратора?

    Таким образом, только члены группы «Администраторы» могут создавать сокеты типа SOCK_RAW в Windows 2000 и более поздних версиях.

Вам нужно добавить больше проверок ошибок в коде. Например, если сбой socket():

Если ошибка не возникает, сокет возвращает дескриптор, ссылающийся на новый сокет. В противном случае возвращается значение INVALID_SOCKET, и конкретный код ошибки можно получить, вызвав WSAGetLastError.

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; 
} 
Смежные вопросы