如何截获数据包?

解决方案 »

  1.   

    这是从某个网站上下载的,但不料用BCB编译后运行出错,现在看看错在哪儿。一下是主程序,错误就在这里。完整程序供下载。有一点要注意,就是编译连接时需要加上ws2_32.lib这个库,方法是Project->Add,选中这个库加入即可。void main(int argc, char ** argv){int iErrorCode;char RecvBuf[MAX_PACK_LEN] = {0};usage();if(GetCmdLine(argc, argv)==CMD_PARAM_HELP) exit(0);//初始化SOCKETWSADATA wsaData;iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);CheckSockError(iErrorCode, "WSAStartup");SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(SockRaw, "socket");//获取本机IP地址char FAR name[MAX_HOSTNAME_LAN];iErrorCode = gethostname(name, MAX_HOSTNAME_LAN);CheckSockError(iErrorCode, "gethostname");struct hostent FAR * pHostent;                                 //注意下面这三句,这里先对pHostent分配了一块pHostent = (struct hostent * )malloc(sizeof(struct hostent)); //内存,然后有让它等于gethostbyname函数的返回pHostent = gethostbyname(name);                                //值,但gethostbyname函数是自己在函数内部分配内存的,因此上一句根本就是多余,把上一句删除后一切正常。但此程序用VC6编译运行都没有问题,不知为何?也许是VC6的编译器优化在起作用。SOCKADDR_IN sa;sa.sin_family = AF_INET;sa.sin_port = htons(6000);memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);free(pHostent);   //由于前面分配内存的语句已经删除,所以这一句也要去掉,否则出错。感谢网友 Heyuming 发现这个问题。iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包DWORD dwBufferLen[10] ;DWORD dwBufferInLen = 1 ;DWORD dwBytesReturned = 0 ;iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );CheckSockError(iErrorCode, "Ioctl");//侦听IP报文while(1){memset(RecvBuf, 0, sizeof(RecvBuf));iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0);CheckSockError(iErrorCode, "recv");iErrorCode = DecodeIpPack(RecvBuf, iErrorCode);CheckSockError(iErrorCode, "Decode");}}
      

  2.   

    我有在win2000下截获数据包的程序,如果需要,告诉我你的Email,我发给你。
      

  3.   

    有几种方法可以实现:
      一种就是楼楼上的raw socket
      二是用winpcap,你在google搜索一下,下载一个winpcap开发包,里面有demo,不过得自己推敲。
      

  4.   

    希望给我一个 谢谢
    [email protected]
      

  5.   

    用winpcap把,自己用不要钱的,可以获得完整的帧,还有一些开发包要钱,如pca的。用SOCK_RAW只能获得IP数据报。
      

  6.   

    希望给我一个 谢谢
    [email protected]
      

  7.   

    我这里有一个ms等发起开发的一个包捕获工具Analyzer.功能挺强大的
    可以发给你们。[email protected]
      

  8.   

    thanks a lot!
    [email protected]
      

  9.   

    jose_hg我的信箱是:[email protected]
               [email protected]多谢了。