微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

winsock2 不支持原始套接字监听

如何解决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 举报,一经查实,本站将立刻删除。