func (p *Pcap) NextEx() (pkt *Packet, result int32) { var pkthdr_ptr *C.struct_pcap_pkthdr var pkthdr C.struct_pcap_pkthdr var buf_ptr *C.u_char var buf unsafe.Pointer result = int32(C.hack_pcap_next_ex(p.cptr, &pkthdr_ptr, &buf_ptr)) buf = unsafe.Pointer(buf_ptr) pkthdr = *pkthdr_ptr if nil == buf { pkt = nil return } pkt = new(Packet) pkt.Time.Sec = int32(pkthdr.ts.tv_sec) pkt.Time.Usec = int32(pkthdr.ts.tv_usec) pkt.Caplen = uint32(pkthdr.caplen) pkt.Len = uint32(pkthdr.len) pkt.Data = make([]byte, pkthdr.caplen) for i := uint32(0); i < pkt.Caplen; i++ { pkt.Data[i] = *(*byte)(unsafe.Pointer(uintptr(buf) + uintptr(i))) } return }
func (p *Pcap) NextEx() (pkt *Packet, result int32) { var pkthdr_ptr *C.struct_pcap_pkthdr var pkthdr C.struct_pcap_pkthdr var buf_ptr *C.u_char var buf unsafe.Pointer result = int32(C.hack_pcap_next_ex(p.cptr, &pkthdr_ptr, &buf_ptr)) buf = unsafe.Pointer(buf_ptr) pkthdr = *pkthdr_ptr if nil == buf { return } pkt = new(Packet) pkt.Time = time.Unix(int64(pkthdr.ts.tv_sec), int64(pkthdr.ts.tv_usec)*1000) // pcap provides usec but time.Unix requires nsec pkt.Caplen = uint32(pkthdr.caplen) pkt.Len = uint32(pkthdr.len) pkt.Data = make([]byte, pkthdr.caplen) pkt.DataLink = p.datalink for i := uint32(0); i < pkt.Caplen; i++ { pkt.Data[i] = *(*byte)(unsafe.Pointer(uintptr(buf) + uintptr(i))) } return }
func (p *Pcap) PcapLoop(pktnum int, dumper *PcapDumper) (result int32, err error) { var pkthdr_ptr *C.struct_pcap_pkthdr var buf_ptr *C.u_char for i := 0; true; { result = int32(C.hack_pcap_next_ex(p.cptr, &pkthdr_ptr, &buf_ptr)) switch result { case 0: continue // timeout case 1: // success : capturing packet case -1: return result, errors.New("Error in pcap next ex") case -2: return // reach EOF in offline mode } if nil == buf_ptr { continue } if nil != dumper { p.PcapDump(dumper, pkthdr_ptr, buf_ptr) p.PcapDumpFlush(dumper) } if pktnum > 0 { i++ if i >= pktnum { break } } } return }
func (p *Pcap) NextEx() (pkt *Packet, result int32) { var pkthdr *C.struct_pcap_pkthdr var buf_ptr *C.u_char var buf unsafe.Pointer result = int32(C.hack_pcap_next_ex(p.cptr, &pkthdr, &buf_ptr)) buf = unsafe.Pointer(buf_ptr) if nil == buf { return } pkt = new(Packet) pkt.Time = time.Unix(int64(pkthdr.ts.tv_sec), int64(pkthdr.ts.tv_usec)*1000) pkt.Caplen = uint32(pkthdr.caplen) pkt.Len = uint32(pkthdr.len) pkt.Data = C.GoBytes(buf, C.int(pkthdr.caplen)) return }