分析pcap包(基于UDP)

//c代码

#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
#include <string.h>
#include <netinet/in.h>
#include <time.h>
#include <syslog.h>

/* *.pcap file format  =  file header(24B) + pkt header(16B) + Frame
 * Frame  =  Ethernet header(14B) + IP header(20B) + UDP header(8B) + appdata */

//enhernet header (14B)
typedef struct _eth_hdr
{
    unsigned char dstmac[6]; //目标mac地址
    unsigned char srcmac[6]; //源mac地址
     unsigned short eth_type; //以太网类型
}eth_hdr; 

//IP header 20B
typedef struct _ip_hdr
{
    unsigned char ver_hlen; //版本
    unsigned char tos;       //服务类型
    unsigned short tot_len;  //总长度
    unsigned short id;       //标志
    unsigned short frag_off; //分片偏移
    unsigned char ttl;       //生存时间
    unsigned char protocol;  //协议
    unsigned short chk_sum;  //检验和
    struct in_addr srcaddr;  //源IP地址
    struct in_addr dstaddr;  //目的IP地址
}ip_hdr;

//udp header  8B
typedef struct _udp_hdr
{
    unsigned short src_port; //远端口号
    unsigned short dst_port; //目的端口号
    unsigned short uhl;      //udp头部长度
    unsigned short chk_sum;  //16位udp检验和
}udp_hdr;

#define FILE_HEADER          24
#define FRAME_HEADER_LEN     (sizeof(eth_hdr) + sizeof(ip_hdr) + sizeof(udp_hdr))
#define LOGLEN               2048
#define NEED_HEADER_INFO     1 

int main(int argc, char **argv)
{
    FILE *fp;
    int fileOffset;
    int pktHeaderLen;
    char data[LOGLEN] = {0};
//    struct pcap_file_header *fHeader;
    struct pcap_pkthdr *pktHeader;

    if (argc < 2) {
        printf("usage: ./exe *.pcap\n");
        exit(1);
    }
#ifdef NEED_HEADER_INFO
    printf("nead header info\n");
    eth_hdr *EthHeader;
    ip_hdr *IPHeader;
    udp_hdr *UDPHeader;

    EthHeader  = (eth_hdr*)malloc(sizeof(*EthHeader));
    IPHeader  = (ip_hdr*)malloc(sizeof(*IPHeader));
    UDPHeader  = (udp_hdr*)malloc(sizeof(*UDPHeader));

    memset(EthHeader, 0, sizeof(*EthHeader));
    memset(IPHeader, 0, sizeof(*IPHeader));
    memset(UDPHeader, 0, sizeof(*UDPHeader));
#endif
    pktHeader = (struct pcap_pkthdr*)malloc(sizeof(*pktHeader));
    memset(pktHeader, 0, sizeof(*pktHeader));

    fp = fopen(argv[1], "r");
    if (fp == NULL) {
        perror("open file error");
        exit(-1);
    }

    openlog("test", LOG_PID, 0);
    fileOffset = FILE_HEADER;    //ingore file header
    while (fseek(fp, fileOffset, SEEK_SET) == 0) {
        // can get time from pktheader
        if (fread(pktHeader, 1, sizeof(*pktHeader), fp) == 0) {
            printf("file end\n");
            return 0;
        }
        fileOffset += 16 + pktHeader->len;
        pktHeaderLen = pktHeader->len - FRAME_HEADER_LEN;

        printf("%d\n", pktHeaderLen);

#ifdef NEED_HEADER_INFO
        //get eth header...
        if (fread(EthHeader, 1, sizeof(*EthHeader), fp) == 0) {
            printf("file end\n");
            return 0;
        }   

        //get ip header...
        if (fread(IPHeader, 1, sizeof(*IPHeader), fp) == 0) {
            printf("file end\n");
            return 0;
        }   

        //get udp herader
        if (fread(UDPHeader, 1, sizeof(*UDPHeader), fp) == 0) {
            printf("file end\n");
            return 0;
        }
#else
        fseek(fp,  FRAME_HEADER_LEN, SEEK_CUR); //ingore ether header
#endif
        if (fread(data, 1, pktHeaderLen, fp) == 0) {
            printf("file end\n");
            return 0;
        }
        data[pktHeaderLen] = ‘\0‘;

        printf("%s\n", data);
        sleep(1);
        syslog(LOG_SYSLOG | LOG_INFO, "%s", data);
        memset(data, 0, LOGLEN);
    }

    free(pktHeader);
#ifdef NEED_HEADER_INFO
    free(EthHeader);
    free(IPHeader);
    free(UDPHeader);
#endif
    closelog();
    fclose(fp);
    return 0;
}

测试已通过

时间: 2024-10-14 15:48:35

分析pcap包(基于UDP)的相关文章

【毕业设计日记-4月】pcap编程之分析数据包

昨天看到了最重要的一部分,分析数据包. 这个分析UDP的程序基本上前面都能看得懂,主要还是对报文的分析这一部分. 在blog里找到的图,对于这个过程,反过来也就是:应用层数据,封装成UDP或者TCP报文,再加上IP首部,然后再加上以太网首部,就成为了可以在链路层传播的数据帧. 以太网驱动程序首先根据以太网首部中的"上层协议"字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP.ARP 还是RARP 协议的数据报,然后交给相应的协议处理.假如是IP 数据报

recv原理、高阶版黏包解决方案、基于UDP的socket通信

recv原理.高阶版黏包解决方案.基于UDP的socket通信 recv原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the optional flags argument, see the Unix manual. 对于这些设置的参数,可以查看Unix手册. When no data is available, block untilat least one byte is av

tcpdump教程 - 从命令行抓取和分析数据包

前言 在介绍和使用tcpdump之前,请确保您已经掌握或者了解如下几个关键概念,否则后面的内容让你有点痛苦. 能够在Linux命令行下工作 理解OSI七层网络协议的概念 熟悉各层的协议头部,重点是IP/TCP/UDP 交换机和路由器对应于OSI的协议层 另外还需要注意的是: tcpdump是基于Unix系统的命令行式的数据包嗅探工具.如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给

Wireshark解析RTP码流包(UDP)

平台国标对接,上级平台请求视频流的时候,码流可基于TCP或UDP进行传输.当上级平台点播视频出现花屏.卡顿情况时,通过抓取码流包来分析下级推送的视频流是否正常,排查视频质量问题. 1.解码为RTP数据包 使用wireshark抓包工具抓取码流包(如下图),基于UDP传输.选中其中一个数据包,右键选择解码为(如下图).选择解码为RTP流(如下图).解码后,可看到数据包解码成了RTP包(如下图). 2.RTP流分析 解码成RTP包后,对RTP包进行流分析. 3.保存视频流 进行流分析后,把数据保存为

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

java Socket编程-基于UDP

package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * * @author wzy * 服务器端,实现基于UDP的用户登陆 */ public class UDPserver { public static void main(String[] args) { try{ //1.创建服务器端Datagram

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

基于 UDP 协议的网络编程

类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序 UDP 数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达 DatagramPacket 对象封装了 UDP 数据报(<64k),在数据报中包含了发送端的 IP 地址和端口号以及接收端的 IP 地址和端口号 UDP 协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接 举例: publ

Windows下基于UDP的可靠传输协议实现

前言:在某互联网公司实习了好几个月,有一个月都是在做基于UDP协议的应用层软件开发,目的是要用在流媒体服务器上,传输高清视频图像帧.整个开发过程,从0到最后完成了几百兆以上的大文件可靠传输,但效率方面还需要进一步提升.UDP网络传输协议部分编程,由于存在丢包问题,确实有点复杂,现在分享一下自己的开发经验. #ifndef UDPNONBLOCKINGOUTPUT #define UDPNONBLOCKINGOUTPUT #include "winsock.h" #include <