其它数据包都能捕获的,包括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原始套接字广播数据包

解决方案 »

  1.   

    创建原始套节字 WSASocket 用的是这个,不是socket,刚看了下,
      

  2.   


    我用WSASocket效果是一样的m_Sockcap = WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
    用其它工具是能捕获到255.255.255.255的广播数据包,应该不是OS的问题
      

  3.   

    如果发送的广播数据是UDP协议,而你的机器上有UDP程序在些端口接收广播数据,你的原始socket就不会收到广播数据报。可以看一下《WinSock网络编程经络》,有说明,这有很多socket源码,你也可以看一下:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  4.   

    本帖最后由 oyljerry 于 2013-03-08 16:15:47 编辑
      

  5.   

    网络抓包工具一般都用的驱动吧,装的时候一般都要装winpcap,你用winpcap抓来看看,网上例子很多,简单抓包分析的代码量也很小.
      

  6.   

    针对255.255.255.255这个地址,实际上是个受限的广播地址,在操作系统上,一般用应用层上的UDP发送,是发不出这个地址的。你可以容易发送一个针对指向网络的广播:192.168.1.255。而实际上,我们也基本用不到4个255地址的广播报文。像ARP、DHCP这样的广播报文,是系统自身的特殊协议数据包。所以不用在应用层上试图发送4个255的受限报文。在一些单片机上,可以直接在发送的原始数据包中填写4个255的地址。你用抓包软件可以看到这些数据包,但是在应用层上,你基本上收不到这些报文
    http://bbs.csdn.net/topics/340258279
      

  7.   

    理论上,可以捕获255.255.255.255的广播包,我之前的写过一个工具可以捕获
    1、确保你的Socket版本是否是2.2的
    2、 这个改一下err = WSAIoctl(m_Sockcap,
            SIO_RCVALL,
            &dwBufferInLen,
            sizeof(dwBufferInLen),
            NULL,
            0,
            &dwBytesReturned,
            NULL,
            NULL);
    这样你试下。
      

  8.   

    err = setsockopt(m_Sockcap, IPPROTO_IP, SO_BROADCAST, (char*)&bopt, sizeof(bopt));这个我在另一处看到是写成这样:
    err = setsockopt(m_Sockcap, SOL_SOCKET, SO_BROADCAST, (char *)&bopt, sizeof(bopt));