其它数据包都能捕获的,包括UDP,TCP,ICMP,IGMP但是255.255.255.255地址的广播数据捕获不到,是不是套接字选项哪里设置的不对int Sock::Capture(int interf/*INTERFACE0*/,bool header/*true*/)
{
int err;
BOOL bopt=TRUE;
m_Sockcap = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(m_Sockcap==INVALID_SOCKET)
return WSAGetLastError(); bopt = TRUE;
err = setsockopt(m_Sockcap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(bopt));
err = setsockopt(m_Sockcap, IPPROTO_IP, SO_BROADCAST, (char*)&bopt, sizeof(bopt));
sockaddr_in sockaddr;
DWORD dwBufferInLen=1;
DWORD dwBufferLen[10];
DWORD dwBytesReturned=0;
//WSAOVERLAPPED lpOverlapped; char FAR name[MAXHOSTNAMELEN];
int length=sizeof(sockaddr);
m_Capport = interf; err = gethostname(name,MAXHOSTNAMELEN);
if(err==SOCKET_ERROR)
return WSAGetLastError();
LPHOSTENT iphp;
iphp = gethostbyname(name);
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(m_Capport);
memcpy(&sockaddr.sin_addr.S_un.S_addr,iphp->h_addr_list[0],iphp->h_length); err=bind(m_Sockcap,(SOCKADDR*)&sockaddr,sizeof(sockaddr));
if(err==SOCKET_ERROR)
return WSAGetLastError(); err = setsockopt(m_Sockcap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt));
if(err==SOCKET_ERROR)
return WSAGetLastError();
//Set this option to receive all IP packets.
err = WSAIoctl(m_Sockcap,
SIO_RCVALL,
&dwBufferInLen,
sizeof(dwBufferInLen),
dwBufferLen,
sizeof(dwBufferLen),
&dwBytesReturned,
NULL,
NULL);
if(err==SOCKET_ERROR)
return WSAGetLastError();
m_bCaptureThreadRun = true;
m_hCapThread = CreateThread(NULL, 0, CaptureThread, this, 0, NULL);
if(m_hCapThread==NULL)
{
m_bCaptureThreadRun = false;
closesocket(m_Sockcap);
m_Sockcap = INVALID_SOCKET;
return -1;
}
return 0;
}
socket原始套接字广播数据包
{
int err;
BOOL bopt=TRUE;
m_Sockcap = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(m_Sockcap==INVALID_SOCKET)
return WSAGetLastError(); bopt = TRUE;
err = setsockopt(m_Sockcap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(bopt));
err = setsockopt(m_Sockcap, IPPROTO_IP, SO_BROADCAST, (char*)&bopt, sizeof(bopt));
sockaddr_in sockaddr;
DWORD dwBufferInLen=1;
DWORD dwBufferLen[10];
DWORD dwBytesReturned=0;
//WSAOVERLAPPED lpOverlapped; char FAR name[MAXHOSTNAMELEN];
int length=sizeof(sockaddr);
m_Capport = interf; err = gethostname(name,MAXHOSTNAMELEN);
if(err==SOCKET_ERROR)
return WSAGetLastError();
LPHOSTENT iphp;
iphp = gethostbyname(name);
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(m_Capport);
memcpy(&sockaddr.sin_addr.S_un.S_addr,iphp->h_addr_list[0],iphp->h_length); err=bind(m_Sockcap,(SOCKADDR*)&sockaddr,sizeof(sockaddr));
if(err==SOCKET_ERROR)
return WSAGetLastError(); err = setsockopt(m_Sockcap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt));
if(err==SOCKET_ERROR)
return WSAGetLastError();
//Set this option to receive all IP packets.
err = WSAIoctl(m_Sockcap,
SIO_RCVALL,
&dwBufferInLen,
sizeof(dwBufferInLen),
dwBufferLen,
sizeof(dwBufferLen),
&dwBytesReturned,
NULL,
NULL);
if(err==SOCKET_ERROR)
return WSAGetLastError();
m_bCaptureThreadRun = true;
m_hCapThread = CreateThread(NULL, 0, CaptureThread, this, 0, NULL);
if(m_hCapThread==NULL)
{
m_bCaptureThreadRun = false;
closesocket(m_Sockcap);
m_Sockcap = INVALID_SOCKET;
return -1;
}
return 0;
}
socket原始套接字广播数据包
我用WSASocket效果是一样的m_Sockcap = WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
用其它工具是能捕获到255.255.255.255的广播数据包,应该不是OS的问题
http://download.csdn.net/detail/geoff08zhang/4571358
http://bbs.csdn.net/topics/340258279
1、确保你的Socket版本是否是2.2的
2、 这个改一下err = WSAIoctl(m_Sockcap,
SIO_RCVALL,
&dwBufferInLen,
sizeof(dwBufferInLen),
NULL,
0,
&dwBytesReturned,
NULL,
NULL);
这样你试下。
err = setsockopt(m_Sockcap, SOL_SOCKET, SO_BROADCAST, (char *)&bopt, sizeof(bopt));