亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang監(jiān)聽ip數據包的實現步驟(golang純享版)

 更新時間:2024年02月25日 09:45:38   作者:docker真的爽爆了  
這篇文章主要給大家介紹了golang監(jiān)聽ip數據包的實現步驟,本文以ip4 作為案例進行包抓取示范,ip6抓取與ip4方式異曲同工,可自行舉一反三得出,文中通過圖文結合給大家介紹的非常詳細,需要的朋友可以參考下

golang 監(jiān)聽ip數據包(golang純享版)

【注】本機編譯運行平臺為linux,如需測試代碼請移至linux平臺進行代碼測試

本文以ip4 作為案例進行包抓取示范,ip6抓取與ip4方式異曲同工,可自行舉一反三得出

第一步,通過wireshark抓包拿到ip4下的tcp/udp包,通過wireshark可視化我們可以很容易找到我們需要的源/目的地址信息所在ip包字節(jié)數. 這里兩張截圖,一張ip4,一張ip6的

請?zhí)砑訄D片描述

請?zhí)砑訄D片描述

第二步,編寫我們秘制的簡易抓包工具,此處以直接輸出來源和去向地址為例,自己可以根據需求做更改

package inet

import (
	"encoding/binary"
	"fmt"
	"strconv"
	"syscall"
	"unsafe"
)

func reverse(b []byte) {
	var (
		mid  uint8
		blen = len(b)
	)
	if blen > 1 {
		for i := 0; i < blen/2; i++ {
			mid = b[i]
			b[i] = b[blen-i-1]
			b[blen-i-1] = mid
		}
	}
}
//主機字節(jié)序變網絡字節(jié)序
func Htons[T uint | uint16 | uint32 | uint64](t T) T {
	var (
		b   []byte = make([]byte, unsafe.Sizeof(t))
		ptr *T     = (*T)(unsafe.Pointer(&b[0]))
	)
	*ptr = t
	reverse(b)
	return *ptr
}

//ip包必選,ip6自行根據wireshark進行編寫,此處ip4為例
type IPHeader struct {
	Version_And_Len        uint8//前4個bit為version(4 ip4,6 ip6),后bit個字節(jié)為首部length xxxx xxxx
	DiffernetialtedService uint8
	Tot_Len                uint16
	Id                     uint16
	Flag_And_Seek          uint16//前3bit 為flag后面13bit為seek
	TTL                    uint8
	Protocol               uint8
	CheckSum               uint16
	Source                 uint32
	Dest                   uint32
}
type PortInfo struct {
	Source uint16
	Dest   uint16
}

var (
	__IP_DEFAULT  IPHeader
	IPHEADER_SIZE = int(unsafe.Sizeof(__IP_DEFAULT))
)

func Watch(watcher func([]byte, int)) error {
  //socket af_packet 會抓取全部網卡的IP數據包,如需監(jiān)聽特定的網卡請自行判斷
	fd, _, err_ := syscall.Syscall(syscall.SYS_SOCKET, syscall.AF_PACKET, syscall.SOCK_DGRAM, uintptr(Htons[uint16](syscall.ETH_P_IP)))
	if int(fd) < 0 {
		return err_
	}
	ifd := int(fd)
	var (
		buff []byte = make([]byte, 512)
		lang int
		err error
	)
	defer syscall.Close(ifd)
	fmt.Println("start watch raw stream", ifd)
	for {
		lang, _, err = syscall.Recvfrom(ifd, buff, 0)
		if lang <= 0 {
			break
		}
		watcher(buff, lang)
	}
	return err
}
//輸出所有來源去向
func print_info(info []byte, size int) {
	if size <= IPHEADER_SIZE {
		return
	}
	var (
		ipheader *IPHeader = (*IPHeader)(unsafe.Pointer(&info[0]))
		portinfo *PortInfo
	)
	if size > IPHEADER_SIZE+4 {
		portinfo = (*PortInfo)(unsafe.Pointer(&info[IPHEADER_SIZE]))
		fmt.Printf("src %s:%d dst %s:%d\n", Raw2String(ipheader.Source), portinfo.Source, Raw2String(ipheader.Dest), portinfo.Dest)
	} else {
		fmt.Printf("src %s dst %s\n", Raw2String(ipheader.Source), Raw2String(ipheader.Dest))
	}

}
func Raw2String(src uint32) string {
	raw := make([]byte, 4)
	binary.LittleEndian.PutUint32(raw, src)
	return strconv.FormatUint(uint64(raw[0]), 10) + "." + strconv.FormatUint(uint64(raw[1]), 10) + "." + strconv.FormatUint(uint64(raw[2]), 10) + "." + strconv.FormatUint(uint64(raw[3]), 10)
}
func Print_Info() func([]byte, int) {
	return print_info
}

測試主函數

func main() {
	fmt.Fprintln(os.Stderr, inet.Watch(inet.Print_Info()))
}

效果

請?zhí)砑訄D片描述

以上就是golang監(jiān)聽ip數據包的實現步驟(golang純享版)的詳細內容,更多關于golang監(jiān)聽ip數據包的資料請關注腳本之家其它相關文章!

相關文章

  • Golang使用Gin框架實現http分塊傳輸

    Golang使用Gin框架實現http分塊傳輸

    這篇文章主要為大家詳細介紹了Golang中如何使用Gin框架實現http分塊傳輸功能,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下
    2023-05-05
  • Go語言fmt模塊的完整方法詳解及示例代碼

    Go語言fmt模塊的完整方法詳解及示例代碼

    這篇文章主要介紹了Go語言fmt模塊使用的相關資料,fmt庫最基本的功能之一就是格式化輸出,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • 深入淺出Golang中select的實現原理

    深入淺出Golang中select的實現原理

    在go語言中,select語句就是用來監(jiān)聽和channel有關的IO操作,當IO操作發(fā)生時,觸發(fā)相應的case操作,有了select語句,可以實現main主線程與goroutine線程之間的互動。本文就來詳細講講select的實現原理,需要的可以參考一下
    2022-08-08
  • Golang?Gin框架獲取請求參數的幾種常見方式

    Golang?Gin框架獲取請求參數的幾種常見方式

    在我們平常添加路由處理函數之后,就可以在路由處理函數中編寫業(yè)務處理代碼了,但在此之前我們往往需要獲取請求參數,本文就詳細的講解下gin獲取請求參數常見的幾種方式,需要的朋友可以參考下
    2024-02-02
  • Go語言入門之基礎語法和常用特性解析

    Go語言入門之基礎語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細,對我們學習Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • 在Colaboratory上運行Go程序的詳細過程

    在Colaboratory上運行Go程序的詳細過程

    這篇文章主要介紹了在Colaboratory上運行Go程序,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Go語言類型轉換的方式有哪些

    Go語言類型轉換的方式有哪些

    本文主要介紹了Go語言類型轉換的方式有哪些,類型轉換主要有4種,分別為斷言類型轉換、顯式類型轉換、隱式類型轉換、強制類型轉換,感興趣的可以了解一下
    2023-11-11
  • grpc入門Unary模式使用方法示例教程

    grpc入門Unary模式使用方法示例教程

    這篇文章主要為大家介紹了grpc入門Unary模式使用方法示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Golang并發(fā)控制的三種實現方法

    Golang并發(fā)控制的三種實現方法

    在Golang中,有多種方式可以進行并發(fā)控制,本文詳細的介紹了三種實現方法,Channel優(yōu)點是實現簡單,清晰易懂,WaitGroup優(yōu)點是子協(xié)程個數動態(tài)可調整,Context 優(yōu)點是對子協(xié)程派生出來的孫子協(xié)程的控制,缺點是相對而言的,要結合實例應用場景進行選擇
    2023-08-08
  • go語言單元測試基準測試及表驅動測試示例詳解

    go語言單元測試基準測試及表驅動測試示例詳解

    這篇文章主要為大家介紹了go語言單元測試基準測試及表驅動測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論