From 3018755a5272330b45e89afc258fc536f58e258e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=80=9D=E6=95=8F?= Date: Thu, 25 Aug 2022 09:49:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- main.go | 25 ++---------------- rpc.go | 46 ++++++--------------------------- tap.go | 74 +++++++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 71 insertions(+), 76 deletions(-) diff --git a/.gitignore b/.gitignore index 8b13789..8ef70ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ - +slimming \ No newline at end of file diff --git a/main.go b/main.go index 364ea51..fc7100a 100644 --- a/main.go +++ b/main.go @@ -1,27 +1,6 @@ -package slimming - -import ( - "flag" - "fmt" - "log" - "net" - - gen "slimming/proto/gen" - - "google.golang.org/grpc" -) +package main //go:generate bash -c "protoc --go_out=plugins=grpc:. proto/*.proto" func main() { - flag.Parse() - lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *serverPort)) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } - s := grpc.NewServer() - gen.RegisterFrameServiceServer(s, &RPCServer{}) - log.Printf("server listening at %v", lis.Addr()) - if err := s.Serve(lis); err != nil { - log.Fatalf("failed to serve: %v", err) - } + NewNetCard().Run() } diff --git a/rpc.go b/rpc.go index 6bf3e2a..4cc2f3e 100644 --- a/rpc.go +++ b/rpc.go @@ -1,22 +1,18 @@ -package slimming +package main import ( - "context" "flag" "fmt" "log" "net" gen "slimming/proto/gen" - "time" "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type RPCServer struct { gen.UnimplementedFrameServiceServer - - FrameChan chan [][]byte + netCard *NetCard } var ( @@ -24,38 +20,11 @@ var ( othersAddr = flag.String("addr", "", "The other server addr") ) -var rpcServer = func() *RPCServer { - rs := &RPCServer{} +func newRPCServer(netCard *NetCard) *RPCServer { + return &RPCServer{netCard: netCard} +} - conn, err := grpc.Dial(*othersAddr, - grpc.WithTransportCredentials(insecure.NewCredentials()), - ) - if err != nil { - log.Fatalf("did not connect: %v", err) - } - defer conn.Close() - c := gen.NewFrameServiceClient(conn) - - // Contact the server and print out its response. - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - - stream, err := c.SendFrames(ctx) - if err != nil { - panic(err) - } - - err = stream.Send(&gen.Request{ - Frames: <-rs.FrameChan, - }) - if err != nil { - panic(err) - } - - return rs -}() - -func (rpc *RPCServer) Run() { +func (rpc *RPCServer) run() { flag.Parse() lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *serverPort)) if err != nil { @@ -64,6 +33,7 @@ func (rpc *RPCServer) Run() { s := grpc.NewServer() gen.RegisterFrameServiceServer(s, rpc) log.Printf("server listening at %v", lis.Addr()) + if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } @@ -78,7 +48,7 @@ func (s *RPCServer) SendFrames(stream gen.FrameService_SendFramesServer) error { if err != nil { log.Panic(err) } - netCard.FrameChan <- request.GetFrames() + s.netCard.FrameChan <- request.GetFrames() // 接受数据 广播到网卡上 } // err := stream.SendAndClose(&gen.Response{Code: 0}) diff --git a/tap.go b/tap.go index 1670741..d8bde49 100644 --- a/tap.go +++ b/tap.go @@ -1,19 +1,72 @@ -package slimming +package main import ( + "context" "log" + gen "slimming/proto/gen" "time" "github.com/songgao/packets/ethernet" "github.com/songgao/water" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type NetCard struct { FrameChan chan [][]byte ifce *water.Interface + cli *RPCClient + server *RPCServer } -var netCard = func() *NetCard { +type RPCClient struct { + FrameChan chan [][]byte +} + +func (cli *RPCClient) run() { + log.Println("rpcclient start") + defer log.Println("rpcclient exit") + + conn, err := grpc.Dial(*othersAddr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + if err != nil { + log.Fatalf("did not connect: %v", err) + } + defer conn.Close() + c := gen.NewFrameServiceClient(conn) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + stream, err := c.SendFrames(ctx) + if err != nil { + panic(err) + } + + for { + // Contact the server and print out its response. + + // 发到对面的网卡 + err = stream.Send(&gen.Request{ + Frames: <-cli.FrameChan, + }) + + if err != nil { + panic(err) + } + } + +} + +func (nc *NetCard) Run() { + go nc.runRead() + go nc.runWrite() + go nc.cli.run() + nc.server.run() +} + +func NewNetCard() *NetCard { + config := water.Config{ DeviceType: water.TAP, } @@ -27,20 +80,13 @@ var netCard = func() *NetCard { nc := &NetCard{ FrameChan: make(chan [][]byte, 2000), ifce: ifce, + cli: &RPCClient{FrameChan: make(chan [][]byte, 2000)}, } - - go nc.RunRead() - go nc.RunWrite() - - time.Sleep(time.Second) + nc.server = newRPCServer(nc) return nc -}() - -func GetNetCard() *NetCard { - return netCard } -func (nc *NetCard) RunRead() { +func (nc *NetCard) runRead() { var ifce *water.Interface = nc.ifce var ticker time.Ticker = *time.NewTicker(time.Millisecond * 20) @@ -59,7 +105,7 @@ func (nc *NetCard) RunRead() { } if len(framesBytes) > 0 { - rpcServer.FrameChan <- framesBytes + nc.cli.FrameChan <- framesBytes // 网卡数据 发到对方 } // 写到grpc服务 @@ -72,7 +118,7 @@ func (nc *NetCard) RunRead() { } } -func (nc *NetCard) RunWrite() { +func (nc *NetCard) runWrite() { var ifce *water.Interface = nc.ifce for wframes := range nc.FrameChan {