winsock2 不支持原始套接字监听

问题描述

我正在尝试使用 winsock2 侦听原始 ICMP 数据包。一切正常,直到绑定,但监听功能失败

#include <WS2tcpip.h> // it must be placed here
#include <iphlpapi.h>
#include <tchar.h>
#include <string>
#include <iostream>
#include <Windows.h>
#include <conio.h>

#pragma comment(lib,"Iphlpapi")
#pragma comment(lib,"Ws2_32")

int _tmain(DWORD argc,LPTSTR* argv) {
    WSADATA wData;
    struct addrinfo* result = NULL,hints;

    ZeroMemory(&hints,sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_RAW;
    hints.ai_protocol = IPPROTO_ICMP;
    hints.ai_flags = AI_ALL;

    if (WSAStartup(MAKEWORD(2,2),&wData) != 0) {
        _tprintf(_T("WSAStartup() Failed: Reason %d\n"),WSAGetLastError());
        return 1;
    }

    if (getaddrinfo(nullptr,"20000",&hints,&result) != 0) {
        _tprintf(_T("getaddrinfo() Failed: Reason: %d\n"),GetLastError());
        WSACleanup();
        return 1;
    }

    SOCKET socServer = socket(result->ai_family,result->ai_socktype,result->ai_protocol);

    if (socServer == INVALID_SOCKET) {
        _tprintf(_T("socket() Failed: Reason: %d\n"),GetLastError());
        WSACleanup();
        freeaddrinfo(result); result = nullptr;
        return 1;
    }

    if (bind(socServer,result->ai_addr,result->ai_addrlen) != 0) {
        _tprintf(_T("bind() Failed: Reason: %d\n"),GetLastError());
        WSACleanup();
        closesocket(socServer);
        freeaddrinfo(result); result = nullptr;
        return 1;
    }

    freeaddrinfo(result); result = nullptr;
    int optVal = 1;
    if (setsockopt(socServer,IPPROTO_RAW,SO_broADCAST,(PCHAR)&optVal,sizeof(optVal)) == 0) {
        _tprintf(_T("setsockopt() Failed. Reason: %d\n"),GetLastError());
        return 1;
    }
    
    if (listen(socServer,SOMAXCONN) != 0x0) {
        _tprintf(_T("listen() Failed: Reason: %d\n"),GetLastError());
        WSACleanup();
        closesocket(socServer);
    }


    _getch();
    WSACleanup();
    closesocket(socServer);
}

在执行此代码时,我收到 listen() 失败:原因:10045。此错误意味着 WSAEOPNOTSUPP 并且相同的描述表示不支持操作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)