■ ■ ■ ■ ■ ■
cmd/sing-box/cmd_tools_connect.go
| skipped 14 lines |
15 | 15 | | "github.com/spf13/cobra" |
16 | 16 | | ) |
17 | 17 | | |
18 | | - | var commandFlagNetwork string |
| 18 | + | var ( |
| 19 | + | commandConnectFlagNetwork string |
| 20 | + | commandConnectFlagOutbound string |
| 21 | + | ) |
19 | 22 | | |
20 | 23 | | var commandConnect = &cobra.Command{ |
21 | 24 | | Use: "connect [address]", |
22 | | - | Short: "connect to a address through default outbound", |
| 25 | + | Short: "Connect to an address", |
23 | 26 | | Args: cobra.ExactArgs(1), |
24 | 27 | | Run: func(cmd *cobra.Command, args []string) { |
25 | 28 | | err := connect(args[0]) |
| skipped 4 lines |
30 | 33 | | } |
31 | 34 | | |
32 | 35 | | func init() { |
33 | | - | commandConnect.Flags().StringVar(&commandFlagNetwork, "network", "tcp", "network type") |
| 36 | + | commandConnect.Flags().StringVar(&commandConnectFlagNetwork, "network", "tcp", "network type") |
| 37 | + | commandConnect.Flags().StringVar(&commandConnectFlagOutbound, "outbound", "", "outbound tag") |
34 | 38 | | commandTools.AddCommand(commandConnect) |
35 | 39 | | } |
36 | 40 | | |
37 | 41 | | func connect(address string) error { |
38 | | - | switch N.NetworkName(commandFlagNetwork) { |
| 42 | + | switch N.NetworkName(commandConnectFlagNetwork) { |
39 | 43 | | case N.NetworkTCP, N.NetworkUDP: |
40 | 44 | | default: |
41 | | - | return E.Cause(N.ErrUnknownNetwork, commandFlagNetwork) |
| 45 | + | return E.Cause(N.ErrUnknownNetwork, commandConnectFlagNetwork) |
42 | 46 | | } |
43 | 47 | | instance, err := createPreStartedClient() |
44 | 48 | | if err != nil { |
45 | 49 | | return err |
46 | 50 | | } |
47 | | - | outbound := instance.Router().DefaultOutbound(commandFlagNetwork) |
48 | | - | if outbound == nil { |
49 | | - | return E.New("missing default outbound") |
| 51 | + | defer instance.Close() |
| 52 | + | dialer, err := createDialer(instance, commandConnectFlagNetwork, commandConnectFlagOutbound) |
| 53 | + | if err != nil { |
| 54 | + | return err |
50 | 55 | | } |
51 | | - | conn, err := outbound.DialContext(context.Background(), commandFlagNetwork, M.ParseSocksaddr(address)) |
| 56 | + | conn, err := dialer.DialContext(context.Background(), commandConnectFlagNetwork, M.ParseSocksaddr(address)) |
52 | 57 | | if err != nil { |
53 | 58 | | return E.Cause(err, "connect to server") |
54 | 59 | | } |
| skipped 3 lines |
58 | 63 | | }) |
59 | 64 | | group.Append("download", func(ctx context.Context) error { |
60 | 65 | | return common.Error(bufio.Copy(os.Stdout, conn)) |
| 66 | + | }) |
| 67 | + | group.Cleanup(func() { |
| 68 | + | conn.Close() |
61 | 69 | | }) |
62 | 70 | | err = group.Run(context.Background()) |
63 | 71 | | if E.IsClosed(err) { |
| skipped 7 lines |