streaming

Media streaming and broadcast systems in Go
Log | Files | Refs | README | LICENSE

commit e3efd43f94e6f502942e52c0a77474c1ab474962
parent 97693535acd9ae096cffa7e635491aa97264c4a1
Author: Joshua Callary <joshuacallary@miraitechnologies.com.au>
Date:   Fri,  2 Aug 2024 02:47:13 +1000

pcap: Added Encoding function to encode to .pcap

Diffstat:
Mpcap/parser.go | 27+++++++++++++++++++++++----
Mpcap/parser_test.go | 45+++++++++++++++++++++++++++++++++++++++++++++
Apcap/testing/pcap_file_encode.pcap | 0
3 files changed, 68 insertions(+), 4 deletions(-)

diff --git a/pcap/parser.go b/pcap/parser.go @@ -1,8 +1,10 @@ package pcap import ( + "bytes" "encoding/binary" "errors" + "fmt" "io" ) @@ -35,9 +37,8 @@ type File struct { func decode(reader io.Reader) (*File, error) { var header GlobalHeader - err := binary.Read(reader, binary.LittleEndian, &header) - if err != nil { + if err := binary.Read(reader, binary.LittleEndian, &header); err != nil { return nil, err } @@ -58,8 +59,7 @@ func decode(reader io.Reader) (*File, error) { } data := make([]byte, header.InclLen) - _, err = io.ReadFull(reader, data) - if err != nil { + if _, err = io.ReadFull(reader, data); err != nil { return nil, err } @@ -74,3 +74,22 @@ func decode(reader io.Reader) (*File, error) { Packets: packets, }, nil } + +func encode(file *File) ([]byte, error) { + buf := new(bytes.Buffer) + + if err := binary.Write(buf, binary.LittleEndian, &file.Header); err != nil { + return nil, fmt.Errorf("global header: %v", err) + } + + for _, packet := range file.Packets { + if err := binary.Write(buf, binary.LittleEndian, &packet.Header); err != nil { + return nil, fmt.Errorf("Packet Header: %v", err) + } + if err := binary.Write(buf, binary.LittleEndian, &packet.Data); err != nil { + return nil, fmt.Errorf("Packet Data: %v", err) + } + } + + return buf.Bytes(), nil +} diff --git a/pcap/parser_test.go b/pcap/parser_test.go @@ -31,4 +31,49 @@ func TestReadFile(t *testing.T) { fmt.Printf("Data %d: %x\n", i, packet.Data) } + + encodePcapFile, err := encode(pcapFile) + + if err != nil { + t.Fatalf("encode file: %v", err) + } + + fmt.Printf("Encoded PCAP: %x\n", encodePcapFile) + + f, err := os.Create("testing/pcap_file_encode.pcap") + if err != nil { + t.Fatal(err) + } + defer f.Close() + + _, err = f.Write(encodePcapFile) + if err != nil { + t.Fatalf("Failed to write to PCAP file") + } + + filePathTwo := "testing/pcap_file_encode.pcap" + + fileTwo, err := os.Open(filePathTwo) + if err != nil { + t.Fatal("Failed to open file") + } + defer fileTwo.Close() + + pcap, err := decode(fileTwo) + if err != nil { + t.Fatalf("Failed to read PCAP file: %v", err) + } + + if len(pcap.Packets) == 0 { + t.Fatal("Should be at least one packet but there is 0") + } + + fmt.Printf("PCAP Header: %+v\n", pcap.Header) + + for i, packet := range pcap.Packets { + fmt.Printf("Packet %d: %+v\n", i, packet.Header) + + fmt.Printf("Data %d: %x\n", i, packet.Data) + } + } diff --git a/pcap/testing/pcap_file_encode.pcap b/pcap/testing/pcap_file_encode.pcap Binary files differ.