1 Star 0 Fork 0

kaibb/go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
goPacket.go 1.91 KB
一键复制 编辑 原始数据 按行查看 历史
wxdlong 提交于 8年前 . go socket 创建发送包
package main
import (
"github.com/google/gopacket"
"net"
"github.com/google/gopacket/layers"
"fmt"
"syscall"
)
func main() {
rawBytes := []byte{10, 20, 30}
options := gopacket.SerializeOptions{}
//修改IP层信息,不过好像还有点问题
ipLayer := &layers.IPv4{
Version:4,
TTL:128,
Length:0x50,
SrcIP: net.IP{127, 0, 0, 1},
DstIP: net.IP{8, 8, 8, 8},
Protocol:layers.IPProtocolIPv4,
Flags:layers.IPv4DontFragment,
TOS:1<<3,
}
//修改Ethernet层的信息
ethernetLayer := &layers.Ethernet{
SrcMAC: net.HardwareAddr{0xFF, 0xAA, 0xFA, 0xAA, 0xFF, 0xAA},
DstMAC: net.HardwareAddr{0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD},
EthernetType:layers.EthernetTypeIPv4,
}
tcpLayer := &layers.TCP{
SrcPort: layers.TCPPort(4321),
DstPort: layers.TCPPort(80),
}
// And create the packet with the layers
buffer := gopacket.NewSerializeBuffer()
gopacket.SerializeLayers(buffer, options,
ethernetLayer,
ipLayer,
tcpLayer,
gopacket.Payload(rawBytes),
)
var (
sockfd int
err error
n int
)
//打开RAW socket.
if sockfd, err = syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, syscall.ETH_P_IP); err != nil {
fmt.Print("Socket() error:", err.Error())
return
}
defer syscall.Shutdown(sockfd, syscall.SHUT_RDWR)
//获取本机回路网络信息
if_info, err := net.InterfaceByName("lo")
if err != nil {
fmt.Println("=============================================================================")
fmt.Println("= Error 2 =")
fmt.Println("=============================================================================")
fmt.Println(err)
}
addr := syscall.SockaddrLinklayer{
Protocol: syscall.ETH_P_IP,
Ifindex: if_info.Index,
}
syscall.Bind(sockfd,&addr)
if n,err = syscall.Write(sockfd, buffer.Bytes()); err != nil {
fmt.Print("Sendto() error: ", err.Error())
return
}
fmt.Printf("Send success! %s",n)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/bb/go.git
git@gitee.com:bb/go.git
bb
go
go
master

搜索帮助