55 lines
988 B
Go
55 lines
988 B
Go
package eth
|
||
|
||
import (
|
||
"log"
|
||
|
||
"github.com/google/gopacket"
|
||
"github.com/google/gopacket/pcap"
|
||
"github.com/gorilla/websocket"
|
||
)
|
||
|
||
const (
|
||
interfaceName = "eth0"
|
||
)
|
||
|
||
type Eth struct {
|
||
Handle *pcap.Handle
|
||
}
|
||
|
||
func Init() *Eth {
|
||
handle, err := pcap.OpenLive(interfaceName, 1600, true, pcap.BlockForever)
|
||
if err != nil {
|
||
log.Fatal("打开驱动器失败: ", err)
|
||
return nil
|
||
}
|
||
return &Eth{Handle: handle}
|
||
}
|
||
|
||
/**
|
||
* 抓取网卡的数据,并写入WebSocket
|
||
*/
|
||
func (eth *Eth) EthernetPacketsToWs(wsConn *websocket.Conn) error {
|
||
|
||
packetSource := gopacket.NewPacketSource(eth.Handle, eth.Handle.LinkType())
|
||
for packet := range packetSource.Packets() {
|
||
wsConn.WriteMessage(websocket.BinaryMessage, packet.Data())
|
||
}
|
||
return nil
|
||
}
|
||
|
||
/**
|
||
* 将ws的数据写入网卡
|
||
*/
|
||
func (eth *Eth) WsToEthernet(wsConn *websocket.Conn) {
|
||
for {
|
||
_, p, err := wsConn.ReadMessage()
|
||
if err != nil {
|
||
return
|
||
}
|
||
err = eth.Handle.WritePacketData(p)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
}
|
||
}
|