【问题标题】:getting an error associated with WSAIoctl收到与 WSAIoctl 相关的错误
【发布时间】:2013-01-29 19:12:49
【问题描述】:

嘿,伙计们,我一直在尝试制作一个简单的控制台应用程序来查看我的网络流量:P 我试图只是阅读它。

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

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

我试过在没有运气的情况下弄乱论点:/请帮助我: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");
}

【问题讨论】:

  • 除了@SteveTownsend 所说的,创建SOCK_RAW 套接字需要管理员权限,但是在使用套接字之前您并没有检查socket() 是否成功。请参阅msdn.microsoft.com/en-us/library/ms740548.aspx:“因此,只有管理员组的成员才能在 Windows 2000 及更高版本上创建 SOCK_RAW 类型的套接字。”

标签: c++ winapi winsock2


【解决方案1】:

您的套接字需要绑定才能监听。此外,对于这个WSAIoctl 选项,您必须遵守(来自MSDN docs):

套接字还必须绑定到明确的本地 IPv4 或 IPv6 接口,这意味着您不能绑定到 INADDR_ANY 或 in6addr_any.

我建议在尝试改进此代码之前进行一些基本的自学。 MSDN 中有一些常见操作的代码示例,例如套接字设置。

【讨论】:

  • naa 我喜欢这样学习:P 我已经知道几种语言,所以我发现我学习 C++ 很快,只用了 2-3 周,我唯一有问题的行是上面那个,对我来说我应该绑定它是有道理的:L 在 C# 之前遇到过类似的问题
  • 另外,创建SOCK_RAW 套接字需要管理员权限:(msdn.microsoft.com/en-us/library/ms740548.aspx)“因此,只有管理员组的成员才能在 Windows 2000 及更高版本上创建 SOCK_RAW 类型的套接字。”
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 2019-05-07
  • 2021-02-03
  • 2020-12-12
  • 2019-07-07
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多