如下代码,为什么捕获不到本机发出的包。
比如,我打开个网页,或用Outlook发邮件,应该有发出去的包啊,为什么只能捕获收到包,而没有捕获发出的包。
#define SIO_RCVALL            _WSAIOW(IOC_VENDOR,1) m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ; sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
sa.sin_addr.s_addr= m_iLocalIP;
bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR) WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),             
&dwBufferLen, sizeof(dwBufferLen),
&dwBytesReturned , NULL , NULL ) ) recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;

解决方案 »

  1.   

    用recvfrom 函数。
    recv只适用于TCP这样的带连接的协议。
      

  2.   

    将接收部分改成如下,问题依旧。只能捕获来自外界的数据包。无法捕获我本机发出去的数据包。
    s.sin_family = AF_INET;
    s.sin_port = htons(4000);//随便指定个端口?
    s.sin_addr.s_addr = inet_addr("192.168.120.33");//本机地址?

    int iLen = sizeof(s);
    iRet =  recvfrom( pDlg->m_s, buf, sizeof( buf ), 0, (sockaddr*)&s, &iLen) ;
    怎样解决?
      

  3.   

    你发出去的数据包当然收不到了,
    注意:你捕获(recv)的是你收到的包。
      

  4.   

    SOCKET sock;
    WSADATA WSAData;
        struct sockaddr_in addr_in;
    char   LocalName[16]; 
        struct hostent *pHost; 
    long len;
    char recvBuf[MAX_PACK_LEN];
    CString string;
    bool IsNewIP = false;    //检查 Winsock 版本号 
        if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
     AfxMessageBox("WSAStartupFailed!");   
       
    //初始化 Raw Socket 
    if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET) 
     AfxMessageBox("socketFailed!");    
    //if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR) 
       // AfxMessageBox("setsockoptFailed!");
      
    //设置IP头操作选项 
    if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR) 

    //获取本机名 
    if (gethostname((char*)LocalName, sizeof(LocalName)-1) == SOCKET_ERROR)
    AfxMessageBox("gethostnameFailed!");        //获取本地 IP 地址 
        if ((pHost = gethostbyname((char*)LocalName)) == NULL) 
        AfxMessageBox("gethostbynameFailed!");         addr_in.sin_addr   = *(in_addr *)pHost->h_addr_list[0]; //IP 
        addr_in.sin_family = AF_INET; 
        addr_in.sin_port   = htons(10000);     //把 sock 绑定到本地地址上 
        if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
        AfxMessageBox("bindFailed!");    DWORD dwValue = 1;     
        //设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包 
        if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0) 
       AfxMessageBox("ioctlsocketFailed!");    CString SrcIP,DestIP,SrcPort,DestPort,TotalLen;      
        
        int read;
        while(flag)
    {

    read = recv(sock, recvBuf , MAX_PACK_LEN, 0);
    if(read==SOCKET_ERROR)
    {
    string.Format("%d",read) ;
    AfxMessageBox(string);
    //flag = false;
    }
    else
    if(read>0)
    {