问题描述
我正在尝试使用 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 (将#修改为@)