captureing.rar

  • PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 734KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 14
    下载次数
  • 2009-11-26 14:37
    上传日期
该程序实现了捕获和显示SIP数据包的功能。
captureing.rar
  • captureing
  • Debug
  • captureing.exe
    188.1KB
  • captureing.bsc
    1.9MB
  • captureing.ilk
    246.7KB
  • vc60.idb
    161KB
  • main.obj
    21.3KB
  • captureing.pdb
    529KB
  • vc60.pdb
    76KB
  • main.sbr
    0B
  • captureing.plg
    1KB
  • captureing.opt
    52.5KB
  • winpcap.h
    2KB
  • captureing.ncb
    49KB
  • main.cpp
    5.7KB
  • captureing.dsp
    4.3KB
  • captureing.dsw
    545B
内容介绍
#include <stdio.h> #include <pcap.h> #include "winpcap.h" #pragma comment(lib,"wpcap.lib") #pragma comment(lib,"Packet.lib") #pragma comment(lib,"ws2_32.lib") #include "winsock.h" #include "remote-ext.h" int main() { pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; u_int netmask; char packet_filter[] = "ip and udp"; struct bpf_program fcode; /* 获得设备列表 */ if (pcap_findalldevs(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 打印列表 */ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" \n (%s)\n", d->description); else printf(" (No description available)\n"); } if(i==0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return -1; } /*选择设备*/ printf("Enter the interface number (1-%d):",i); scanf("%d", &inum); if(inum < 1 || inum > i) { printf("\nInterface number out of range.\n"); /* 释放设备列表*/ pcap_freealldevs(alldevs); return -1; } /* 跳转到已选适配器 */ for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++); /* 打开适配器 */ if ( (adhandle= pcap_open_live(d->name, // name of the device 65536, // portion of the packet to capture. // 65536 grants that the whole packet will be captured on all the MACs. 1, // promiscuous mode 1000, // read timeout errbuf // error buffer ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported byWinPcap\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } /* 检查数据链路层,为了简单,我们只考虑以太网 */ if(pcap_datalink(adhandle) != DLT_EN10MB) { fprintf(stderr,"\nThis program works only on Ethernet networks.\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } if(d->addresses != NULL) /* 获得接口第一个地址的掩码 */ netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; else /* 如果接口没有地址,那么我们假设一个C类的掩码 */ netmask=0xffffff; //编译过滤器 if(pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 ){ fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } //设置过滤器 if(pcap_setfilter(adhandle, &fcode)<0){ fprintf(stderr,"\nError setting the filter.\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } printf("\nlistening on %s...\n", d->description); /* 释放设备列表 */ pcap_freealldevs(alldevs); /* 开始捕捉 */ pcap_loop(adhandle, 0, packet_handler, NULL); return 0; } /* 回调函数,当收到每一个数据包时会被libpcap所调用 */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { struct tm *ltime; char timestr[16]; ip_header *ih; udp_header *uh; u_int ip_len; u_short sport,dport; // u_int seqnum=0,acknum=0; u_char *data; u_int udp_len=sizeof(udp_header); u_int datalen; FILE *fp; fp=fopen("..\\log.txt","ab+"); /*打开文件失败的错误判断*/ if(fp == NULL) { printf("\n 文件打开失败! \n"); exit(0); } /* 找到IP 头的位置*/ ih = (ip_header *) (pkt_data + 14); //14 为以太头部长度 /* 找到UDP的位置*/ ip_len = (ih->ver_ihl & 0xf) * 4; uh = (udp_header *) ((u_char*)ih + ip_len); /* 将端口信息从网络型转变为主机顺序*/ sport = ntohs( uh->sport ); dport = ntohs( uh->dport ); if(sport == 5060 || dport == 5060) ///UDP的端口号为5060表示SIP通道 { /*加if为了不显示没有数据内容的数据包*/ if(header->len >60 ) { /*标志*/ printf("\n***************One package************************\n"); fprintf(fp,"\r\n***************One package************************\r\n"); /* 将时间戳转换成可识别的格式 */ ltime=localtime(&header->ts.tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); /* 打印数据包的时间戳和长度 */ printf("time:%s.%.6d \npackage->len:%d\n", timestr, header->ts.tv_usec, header->len); fprintf(fp,"time:%s.%.6d \r\npackage->len:%d\r\n", timestr, header->ts.tv_usec, header->len); //printf("the packet caplen is:%d\n",header->caplen); //fprintf(fp,"the packet caplen is:%d\r\n",header->caplen); /*数据包的总长度*/ datalen = (u_int)(ntohs(ih->tlen)) - ip_len -udp_len; printf("Datalen:%d\n",datalen); fprintf(fp,"Datalen:%d\r\n",datalen); /* 打印IP地址和UDP端口 */ printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n", ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4, sport, ih->daddr.byte1, ih->daddr.byte2, ih->daddr.byte3, ih->daddr.byte4, dport); fprintf(fp,"%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\r\n", ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4, sport, ih->daddr.byte1, ih->daddr.byte2, ih->daddr.byte3, ih->daddr.byte4, dport); // printf("seqnum:%u\nacknum:%u\n",ntohl(seqnum),ntohl(acknum)); // fprintf(fp,"seqnum:%u\r\nacknum:%u\r\n",ntohl(seqnum),ntohl(acknum)); /*数据内容不包括udp头*/ data=(u_char *)((u_char*)uh + udp_len); /*打印数据*/ print_Byte(data,datalen,fp); // printf("%s",data); } } fclose(fp); } void print_Byte(u_char* begin, u_int16_t len,FILE *fp) { int i; u_char* pointer = begin; printf("The data content is:\n"); fprintf(fp,"\r\nThe data content is:\r\n"); for(i = 0; i < len; i++, pointer++) { /*用十六进制显示数据包内容*/ //printf("%-4x",*pointer); //fprintf(fp,"%4x", *pointer); /*用字符显示数据包内容*/ printf("%c",*pointer); fprintf(fp,"%c", *pointer); } fclose(fp); }
评论
    相关推荐
    • java-sip-src.rar
      SIP软电话,官方例子,经过测试,可用,可为IP电话开发作为为能考。
    • m3g-sip_gateway.rar
      这个程序实现3G到SIP的网关功能。可以将3G网络的呼叫接入到IP网络中的SIP SERVER
    • JAIN-SIP-WS.rar
      java中sip的应用,可以熟悉sip在java中是使用。。。。。。。
    • Requirements for Interworking WebRTC with Current SIP Deployment
      Requirements for Interworking WebRTC with Current SIP Deployments draft-kaplan-rtcweb-sip-interworking-requirements
    • apiban:REST API,用于共享发送不必要的SIP流量的IP地址
      REST API,用于识别发送不必要的SIP流量的IP地址 APIBAN通过在已知不良行为者攻击您的系统之前识别其地址,帮助防止有害的SIP通信。 通过全球部署的蜜罐收集坏演员,并由策划。 访问了解更多信息。 阻止/识别流量 ...
    • Homer-Conferencing:Homer是一款免费的具有视频支持的跨平台SIP软电话
      Homer Conferencing(简称:Homer)是免费的SIP软电话,具有高级音频和视频支持。 该软件可用于Windows,Linux和OSX。Homer最初是作为视频会议工具开发的。 多年来,这些功能已扩展到其他应用领域。 因此,荷马现在...
    • macos-passive-ecn-sniffer
      capture_ecn嵌入两个脚本,也强制所有连接使用ECN。 您需要使用超级用户权限运行它。 该脚本还可以带有一些参数,但是默认值应该可以。 跟踪 您需要通过禁用系统完整性保护(SIP)来启用dtrace功能。 引导进入恢复...
    • Distributed SIP Analyzer-开源
      分布式SIP分析器是用于Unix的SIP协议分析器。 它使您可以检查来自不同局域网的SIP。 您可以交互式浏览捕获数据,查看呼叫流程序列图和每个SIP会话的详细信息。
    • hep-erlang:总是
      HEP 用于将元数据和 SIP 消息从 SIP 代理或 SIP 用户代理传输到捕获服务器。 HEP 不限于传输 SIP 消息,但在协议的第 3 版之前,无法通过元数据区分有效载荷,因此当通过同一通道传输时,传输第 3 版之前的 SIP ...
    • qpopper2.53.tar.Z
      pop3 server