raw socket接收不到数据

nofarewell nofarewell 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
初学网络编程,照网上的例子写了个sniffer程序,可是执行到recv的时候,就没有返回了,估计是超时。请高人指点:


#include "StdAfx.h"
#include "Sniffer.h"

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535
char RecvBuf[BUFFER_SIZE];

UINT SniffThreadFun(LPVOID pParam);
void SignalHandler(int sig);

Sniffer::Sniffer(void)
: stopSniff(true)
{
}

Sniffer::~Sniffer(void)
{
}

bool Sniffer::InitSocket(void)
{
int err;
int sockOpt = 1;
char localName[100];
struct hostent *hostPtr;
SOCKADDR_IN sockAddr;

WORD versionRequired = MAKEWORD(1,1);
err = WSAStartup(versionRequired, &wsaData);
if(err == SOCKET_ERROR)
return false;
sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sockRaw == INVALID_SOCKET)
return false;
err = setsockopt(sockRaw, IPPROTO_IP, IP_HDRINCL,
(char*)&sockOpt, sizeof(sockOpt));

if (err == SOCKET_ERROR)
return false;
err = gethostname(localName, sizeof(localName)-1);
if (err == SOCKET_ERROR)
return false;
hostPtr = gethostbyname(localName);
if (hostPtr == NULL)
return false;
sockAddr.sin_addr = *(in_addr *)hostPtr->h_addr_list[0];
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(57274);
err = bind(sockRaw, (PSOCKADDR)&sockAddr, sizeof(sockAddr));
if (err == SOCKET_ERROR)
return false;
return true;
}

bool Sniffer::StartSniff(void)
{
stopSniff = false;
int err;
unsigned long arg = 1;

err = ioctlsocket(sockRaw, SIO_RCVALL, &arg);
if (err == SOCKET_ERROR)
int errCode = WSAGetLastError();
return false;

AfxBeginThread(
(AFX_THREADPROC)SniffThreadFun,
(LPVOID)this,
THREAD_PRIORITY_NORMAL,
0, 0, NULL);

return true;
}

bool Sniffer::StopSniff(void)
{
stopSniff = true;
Sleep(2000);
int err;
DWORD arg = 0;
err = ioctlsocket(sockRaw, SIO_RCVALL, &arg);
if (err = SOCKET_ERROR)
return false;

return true;
}

void Sniffer::DisposeSocket(void)
{
WSACleanup();
closesocket(sockRaw);
}

UINT SniffThreadFun(LPVOID pParam)
{
Sniffer *snifferPtr = (Sniffer *)pParam;

while(!snifferPtr->stopSniff)
{
//执行recv的时候没有返回
if (recv(snifferPtr->sockRaw, RecvBuf, BUFFER_SIZE, 0))
{
snifferPtr->recvCallback(snifferPtr->pObserver, RecvBuf);
}
}

return 0;
}
...全文
评论 3
收藏 已收藏
分享
返回顶部
nofarewell
网络编程 18,356 成员 64,161 内容