plugin/hop/example/grpc/main.go
2023-09-28 21:02:11 +08:00

81 lines
1.4 KiB
Go

package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"log"
"net"
"sync/atomic"
"github.com/go-gost/plugin/hop/proto"
"github.com/go-gost/x/config"
"google.golang.org/grpc"
)
var (
port = flag.Int("port", 8000, "The server port")
)
var (
nodes = []*config.NodeConfig{
{
Name: "node-0",
Addr: ":8888",
Connector: &config.ConnectorConfig{
Type: "socks5",
Auth: &config.AuthConfig{
Username: "user",
Password: "pass",
},
},
Dialer: &config.DialerConfig{
Type: "tcp",
},
},
{
Name: "node-1",
Addr: ":9999",
Connector: &config.ConnectorConfig{
Type: "http",
Auth: &config.AuthConfig{
Username: "user",
Password: "pass",
},
},
Dialer: &config.DialerConfig{
Type: "tcp",
},
},
}
)
type server struct {
counter atomic.Uint64
proto.UnimplementedHopServer
}
func (s *server) Select(ctx context.Context, in *proto.SelectRequest) (*proto.SelectReply, error) {
node := nodes[s.counter.Add(1)%uint64(len(nodes))]
v, _ := json.Marshal(node)
reply := &proto.SelectReply{
Node: v,
}
return reply, nil
}
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
proto.RegisterHopServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}