raw socket接收不到数据
初学网络编程,照网上的例子写了个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;
}
...全文
相关推荐
基于raw socket的UDP数据的发送和接收
由于Raw Socket不区分具体的协议,所以需要在接收端解析接收到的数据,判断其是否为UDP数据包,然后提取出头部信息和数据内容。
C#入门经典(第四版)第32章 网络
- **Socket类型**:主要包括流式Socket(SOCK_STREAM)、数据报Socket(SOCK_DGRAM)和原始Socket(SOCK_RAW)。
linux下使用RAW SOCKET接收LLDP报文并解析LLDP报文
**接收数据包**:使用`recvfrom`或`read`函数从RAW SOCKET接收数据包。接收到的数据包是原始的以太网帧,包含LLDP报文。4.
liunx下使用socket实现can总线数据接收
利用Linux的socket接口,开发者可以编写程序来接收和发送CAN总线上的数据。这篇内容将详细介绍如何在Linux环境下使用socket API来实现CAN总线的数据接收。
raw socket来实现ip报文的发送
接收响应:如果需要,可以创建另一个Raw Socket来接收响应数据包。


网络编程
