最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang監(jiān)聽ip數(shù)據(jù)包的實(shí)現(xiàn)步驟(golang純享版)

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

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

【注】本機(jī)編譯運(yùn)行平臺(tái)為linux,如需測(cè)試代碼請(qǐng)移至linux平臺(tái)進(jìn)行代碼測(cè)試

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

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

請(qǐng)?zhí)砑訄D片描述

請(qǐng)?zhí)砑訄D片描述

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

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
		}
	}
}
//主機(jī)字節(jié)序變網(wǎng)絡(luò)字節(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自行根據(jù)wireshark進(jìn)行編寫,此處ip4為例
type IPHeader struct {
	Version_And_Len        uint8//前4個(gè)bit為version(4 ip4,6 ip6),后bit個(gè)字節(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 會(huì)抓取全部網(wǎng)卡的IP數(shù)據(jù)包,如需監(jiān)聽特定的網(wǎng)卡請(qǐng)自行判斷
	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
}

測(cè)試主函數(shù)

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

效果

請(qǐng)?zhí)砑訄D片描述

以上就是golang監(jiān)聽ip數(shù)據(jù)包的實(shí)現(xiàn)步驟(golang純享版)的詳細(xì)內(nèi)容,更多關(guān)于golang監(jiān)聽ip數(shù)據(jù)包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 從零封裝Gin框架及項(xiàng)目初始化教程

    從零封裝Gin框架及項(xiàng)目初始化教程

    這篇文章主要為大家介紹了從零封裝Gin框架及項(xiàng)目的初始化教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • go單例實(shí)現(xiàn)雙重檢測(cè)是否安全的示例代碼

    go單例實(shí)現(xiàn)雙重檢測(cè)是否安全的示例代碼

    這篇文章主要介紹了go單例實(shí)現(xiàn)雙重檢測(cè)是否安全,本文給大家分享雙重檢驗(yàn)示例代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • golang redis 管道的實(shí)現(xiàn)

    golang redis 管道的實(shí)現(xiàn)

    在Golang中操作Redis時(shí),管道是一種優(yōu)化批量命令執(zhí)行效率的重要方式,它通過減少客戶端與Redis服務(wù)器之間的網(wǎng)絡(luò)往返次數(shù),將多個(gè)命令一次性發(fā)送到服務(wù)器,再一次性接收所有響應(yīng),從而顯著提升批量操作的性能
    2026-04-04
  • Go語言基本的語法和內(nèi)置數(shù)據(jù)類型初探

    Go語言基本的語法和內(nèi)置數(shù)據(jù)類型初探

    這篇文章主要介紹了Go語言基本的語法和內(nèi)置數(shù)據(jù)類型,是golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 高效封禁:利用Go封裝功能,提升封禁操作效率

    高效封禁:利用Go封裝功能,提升封禁操作效率

    在網(wǎng)絡(luò)安全領(lǐng)域,封禁操作是一項(xiàng)重要的任務(wù),用于阻止惡意行為和保護(hù)系統(tǒng)安全,而利用Go語言封裝功能可以提升封禁操作的效率,Go語言具有高效的并發(fā)性能和簡潔的語法,使得開發(fā)者可以快速構(gòu)建高性能的封禁系統(tǒng),
    2023-10-10
  • Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)

    Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)

    本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Golang 并發(fā)的實(shí)現(xiàn)

    Golang 并發(fā)的實(shí)現(xiàn)

    本文主要介紹了Golang 并發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • 淺談Golang是如何讀取文件內(nèi)容的(7種)

    淺談Golang是如何讀取文件內(nèi)容的(7種)

    這篇文章主要介紹了淺談Golang是如何讀取文件內(nèi)容的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Go語言單例模式詳解

    Go語言單例模式詳解

    本文主要介紹了Go語言單例模式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang 使用事務(wù)的簡單實(shí)踐

    Golang 使用事務(wù)的簡單實(shí)踐

    事務(wù)是保證數(shù)據(jù)一致性的重要手段,在Golang項(xiàng)目中,我們可以通過事務(wù)管理器或GORM的來簡化事務(wù)的使用,本文就來詳細(xì)的介紹一下Golang 使用事務(wù)的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2025-11-11

最新評(píng)論

长子县| 元江| 汤原县| 平舆县| 民权县| 承德县| 玉林市| 东方市| 泾阳县| 原阳县| 教育| 景泰县| 丹棱县| 顺平县| 双峰县| 芦溪县| 天水市| 霍林郭勒市| 固原市| 德庆县| 西华县| 宾阳县| 秦皇岛市| 余姚市| 尼木县| 温宿县| 介休市| 太原市| 龙口市| 玉树县| 东明县| 古浪县| 雷山县| 宕昌县| 忻城县| 平利县| 大英县| 纳雍县| 安岳县| 永寿县| 无棣县|