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