如题,请教各位了!

解决方案 »

  1.   

    哦 ,只知道wincpap 的开发包可以
      

  2.   

    Socket通信吗?如是,可以在accept或者recvfrom中获取对方的IP地址,如得到对方地址struct sockaddr_in addr;
    则可用下面代码获取:
    char lpszIpAddr[16];
    sprintf_s(lpszIpAddr, 16, "%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1, addr.sin_addr.S_un.S_un_b.s_b2, addr.sin_addr.S_un.S_un_b.s_b3, addr.sin_addr.S_un.S_un_b.s_b4);如果是想获取网卡收到的数据包的IP地址,建议还是用工具吧,很多的。Wireshark就很好用,也是基于Winpcap的。如果自己写代码实现有点麻烦。可以用RAW SOCKET,或者编写网卡过滤驱动。再查查资料吧
      

  3.   

    我从网上看了些网络嗅探器的资料,没有用其他的什么工具,自己写了下,可是程序已运行到recv函数就不行了.我的程序中有一个InitSocket()函数,负责对socket的一些基本设置.
    BOOL CDataSnifferDlg::InitSocket()
    {
    BOOL flag=TRUE;
    m_socket=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
    if(INVALID_SOCKET==m_socket)
    {
    AfxMessageBox("创建套接字失败!");
    return FALSE;
    }
    int setsock=setsockopt(m_socket, SOL_SOCKET,SO_REUSEADDR, (char*)&flag, sizeof(flag));
    if(SOCKET_ERROR==setsock)
    {
    AfxMessageBox("设置套接字选项失败!");
    return FALSE;
    }
    char strHostName[200];
    HOSTENT* pHost;
    gethostname(strHostName,sizeof(strHostName));
    pHost=gethostbyname(strHostName); 
    sockaddr_in addr_in;
    addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
    addr_in.sin_family = AF_INET;
        addr_in.sin_port = htons(57274);
      

    if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addr_in,sizeof(SOCKADDR)))
    {
          AfxMessageBox("绑定失败!");
      return FALSE;
    }
        DWORD dwValue = 1;      ioctlsocket(m_socket, FIONREAD, &dwValue); 

    return TRUE;
    }
    然后在按钮响应函数中
    char RecvBuf[65535];
    IP ip;
    TCP tcp;
        while (true)
    {
    // 接收原始数据包信息
    int ret = recv(m_socket, RecvBuf, 65535, 0);
    if(ret==SOCKET_ERROR)
    {
    AfxMessageBox("接受数据失败!");
    return;
    }
                     ……………………
                   其他代码略
               }
    请高手指点!
      

  4.   

    恩,这个用的就是RAW SOCKET
      

  5.   

    写个spi不就好了。简单又好用
      

  6.   

    最近csdn服务器好像不灵光了,我也遇到过发一次就连发的
      

  7.   


    WORD   wVersionRequested;   
    WSADATA   wsaData;   
    int   err;   
    wVersionRequested   =   MAKEWORD(   2,   2   );   
    err   =   WSAStartup(   wVersionRequested,   &wsaData   );   
    if   (   err   !=   0   )     
    {   
    printf("1 ");   
    }   
    if   (   LOBYTE(   wsaData.wVersion   )   !=   2   ||HIBYTE(   wsaData.wVersion   )   !=   2   )   
    {   
    WSACleanup(   );   
    printf("2");     
    }   //加载套接字库
    SOCKET m_sockCap = socket(AF_INET , SOCK_RAW , IPPROTO_IP);//创建原始套接字char name[65535];
    err = gethostname(name, strlen(name));//获得主机名struct hostent FAR * pHostent;
    pHostent = gethostbyname(name);//获得主机信息int m_nCapPort = 32768;

    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port   = htons(m_nCapPort);
    memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

    err = bind(m_sockCap, (PSOCKADDR)&sa, sizeof(sa));BOOL bopt=TRUE;
    err = setsockopt(m_sockCap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt));

    bopt = TRUE;
    err = setsockopt(m_sockCap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(bopt));
    DWORD dwBufferLen[10];
    DWORD dwBufferInLen   = 1;
    DWORD dwBytesReturned = 0;
    err = WSAIoctl(m_sockCap,
    SIO_RCVALL,
    &dwBufferInLen,
    sizeof(dwBufferInLen),
    dwBufferLen,
    sizeof(dwBufferLen),
    &dwBytesReturned,
    NULL,
    NULL);char recvBuf[65535];
    int read=0;
    while(1)
    {
    read=recv(m_sockCap, recvBuf ,341, 0);if (read > 0)
    {
       if(0x06==(int)recvBuf[9]);//第10位为6说明是tcp包,自己定义数据结构来判断是什么包。
     //你所需要的信息就在recvBuf里面,
    }
    //以上代码在VC6环境编译通过
      

  8.   

    while(1)
    {
    read=recv(m_sockCap, recvBuf ,341, 0);if (read > 0)
    {
      if(0x06==(int)recvBuf[9]);//第10位为6说明是tcp包,自己定义数据结构来判断是什么包。
     //你所需要的信息就在recvBuf里面,
    }
    //以上代码在VC6环境编译通过
    我前面和successful_cy的一样,但是到了这个循环的时候就卡住了,我把循环去掉,能收到一个数据包,但是加了个while,就收不到任何数据包