无论如何我从WSAIoctl函数得到一个错误,错误代码WSAGetLastError给我的是10022,MSDN告诉我它与此相关:
无效的参数。 提供了一些无效参数(例如,为setsockopt函数指定了无效级别)。在某些情况下,它还引用套接字的当前状态 - 例如,在未侦听的套接字上调用accept。
我试过没有运气搞乱这些争论:/请帮助我:P
这是我的代码:
WSADATA wsaData;
int startup = WSAStartup(0x0202, &wsaData);
if(startup != 0) {
cout << "Error: could not initalize WSADATA for target socket." << endl;
system("pause");
}
unsigned long BytesReturned;
int InBuffer, OutBuffer, LPCVoid;
int optValue = 1;
SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
Sleep(await);
cout << "creating and configuring RAW_SOCK" << endl;
int listening = listen(sock, SOMAXCONN); // tried debugging using this.
int sockopt = setsockopt(sock, IPPROTO_IP, 2, (char*)&optValue, sizeof(optValue));
int SockMode = WSAIoctl(sock, SIO_RCVALL, &InBuffer, sizeof(InBuffer), &OutBuffer, sizeof(OutBuffer), &BytesReturned, NULL, NULL);
//0x98000001
if(SockMode == 0) {
Sleep(await);
cout << "RAW_SOCKET created successfully!" << endl << "Trying to listen for incoming network packets..." << endl;
int listeningk = listen(sock, SOMAXCONN);
if(listening == 0) {
Sleep(await);
cout << "socket listening without problems, looking for incoming request..." << endl;
}
else {
Sleep(await);
cout << "Error: could not listen on socket." << endl;
exit(EXIT_FAILURE);
}
}
else {
Sleep(await);
cout << "Error: could not create RAW_SOCKET..." << endl << "Dumping SockMode!\r\nint SockMode = " << SockMode << endl;
cout << "setsockopt = " << sockopt << endl;
cout << "WSAGetLastError: " << WSAGetLastError() << endl;
system("pause");
}
答案 0 :(得分:0)
在收听之前,您的套接字需要绑定。此外,对于此WSAIoctl
选项,您必须遵守(来自MSDN docs):
套接字也必须绑定到显式本地IPv4或IPv6 interface,表示您无法绑定到INADDR_ANY或 IN6ADDR_ANY。
我建议在尝试推进此代码之前先进行一些基本的自我教育。有一些常见操作的代码示例,如MSDN中的套接字设置。