raw socket接收不到数据

nofarewell 2012-07-11 02:56:00
初学网络编程,照网上的例子写了个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;
}
...全文
167 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nofarewell 2012-07-12
  • 打赏
  • 举报
回复
我用的操作系统是windows2003 sp2,应该没有这个限制,不知道什么地方写错了,对照了一段老外的代码,现在可以正常工作了
oyljerry 2012-07-12
  • 打赏
  • 举报
回复
WindowsOS加强了安全限制,估计不支持了
nofarewell 2012-07-12
  • 打赏
  • 举报
回复
别沉,请求帮助

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧