C++ 获取与WSAIoctl关联的错误

C++ 获取与WSAIoctl关联的错误,c++,winapi,winsock2,C++,Winapi,Winsock2,嘿,伙计们,我一直在尝试制作一个简单的控制台应用程序来查看我的网络流量:p我正在尝试读取它 无论如何,我从WSAIoctl函数得到一个错误,WSAGetLastError给我的错误代码是10022,MSDN告诉我它与此相关: 无效参数。 提供了一些无效参数(例如,为setsockopt函数指定了无效级别)。在某些情况下,它还引用套接字的当前状态,例如,在未侦听的套接字上调用accept 我已经尝试过不走运地混淆视听了:/please help me:p 这是我的密码: WSADATA wsaDa

嘿,伙计们,我一直在尝试制作一个简单的控制台应用程序来查看我的网络流量:p我正在尝试读取它

无论如何,我从WSAIoctl函数得到一个错误,WSAGetLastError给我的错误代码是10022,MSDN告诉我它与此相关:

无效参数。 提供了一些无效参数(例如,为setsockopt函数指定了无效级别)。在某些情况下,它还引用套接字的当前状态,例如,在未侦听的套接字上调用accept

我已经尝试过不走运地混淆视听了:/please help me: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");
}
WSADATA-WSADATA;
int startup=WSAStartup(0x0202和wsaData);
如果(启动!=0){

cout您的套接字需要绑定才能进行侦听。此外,对于此
WSAIoctl
选项,您必须遵守(从):

套接字还必须绑定到显式本地IPv4或IPv6 接口,这意味着您不能绑定到INADDR_或 在6个地址中


<>我建议在进行这一代码之前先进行一些基本的自我教育。在MSDN中有一些常用的OPS代码,比如Socket设置。我喜欢这样学习:P我已经知道几种语言,所以我发现我学习C++快,只花了2-3周的时间,我唯一的问题是上面的一个,我觉得我应该绑定它是有道理的:我以前在C上也有类似的问题。同样,创建
SOCK_RAW
sockets需要管理员权限:()“因此,只有Administrators组的成员才能在Windows 2000和更高版本上创建SOCK_RAW类型的套接字。”除了@SteveTownsend所说的之外,创建
SOCK_RAW
socket需要管理员权限,但在使用套接字之前,您不会检查
socket()
是否成功。请参阅:“因此,只有管理员组的成员才能在Windows 2000及更高版本上创建SOCK_RAW类型的套接字。”