我正在尝试向远程网络发送ICMPV6消息,作为初始步骤,我尝试在包含SendICMPv6.c
,{{1}的简单类(winsock2
)中创建ICMPv6套接字。 },ws2tcpip
和stdio
标题。但我无法创建套接字。有人可以帮忙吗?
代码是:
stdlib
有人能解决问题吗?
答案 0 :(得分:2)
如果您仔细阅读documentation,则可以选择几个选项:
您的操作系统可以创建SOCK_RAW
套接字吗?
如果Winsock服务提供商支持AF_INET或AF_INET6地址系列的SOCK_RAW套接字,则SOCK_RAW的套接字类型应包含在WSAPROTOCOL_INFO函数返回的WSAEnumProtocols结构中,用于一个或多个可用的运输供应商。
您是否以管理员身份运行?
因此,只有Administrators组的成员才能在Windows 2000及更高版本上创建SOCK_RAW类型的套接字。
您需要在代码中添加更多错误检查。例如,如果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;
}