代码之家  ›  专栏  ›  技术社区  ›  somejkuser

模拟网络连接而不输入网络拨号

  •  -2
  • somejkuser  · 技术社区  · 7 年前

    这条线:

    ds, err := net.Dial("tcp", backend.String());if err != nil {
        log.Printf("failed to dial %s: %s", backend, err)
        us.Close()
        return
    }
    

    回应 ds https://golang.org/pkg/net/#Dial

    我需要的是获得 tcp dialer . 我是 尝试在没有任何实际tcp调用的情况下测试负载平衡器。所以, 基本上, 我们进去的时候 handleConnection 我们在tcp拨号之前创建一个网络连接并使用这个网络连接,它应该在tcp拨号开始之前模拟100%的网络连接。

    func copy(wc io.WriteCloser, r io.Reader) {        defer wc.Close()
        io.Copy(wc, r)
    }
    
    
    func handleConnection(us net.Conn, backend BA.Backend) {
        if backend == nil {
            log.Printf("no backend available for connection from %s",
            us.RemoteAddr())
            us.Close()
            return
        }
    
        host, _, _ := net.SplitHostPort(us.RemoteAddr().String())
        _, ok := dbAuthTokenData[host]; if !ok {
            w := bufio.NewWriter(us)
            w.WriteString("InvalidCredentials")
            w.Flush()
            us.Close()
            return
        }
    
        ds, err := net.Dial("tcp", backend.String());if err != nil {
            log.Printf("failed to dial %s: %s", backend, err)
            us.Close()
            return
        }
    
        // Ignore errors
        go copy(ds, us)
        go copy(us, ds)
    }
    
    func tcpBalance(bind string, backends BA.Backends) error {
        log.Println("using tcp balancing")
        ln, err := net.Listen("tcp", bind)
        if err != nil {
            return fmt.Errorf("failed to bind: %s", err)
        }
    
        log.Printf("listening on %s, balancing %d backends", bind,                                 backends.Len())
    
        for {
            conn, err := ln.Accept()
            if err != nil {
               log.Printf("failed to accept: %s", err)
                continue
            }
            go handleConnection(conn, backends.Choose())
        }
    
        return err
    }
    

    我试着发表评论 go handleConnection(conn, backends.Choose())

    1 回复  |  直到 7 年前
        1
  •  0
  •   apxp    7 年前

    您可以重构代码的模式是创建 Dialer ds io.ReadWriteCloser . 所以你不需要实施整个计划 net.Conn 网络连接 所有东西里面都有读写方法吗

    type Dialer interface{
        Dial(network, address string) (io.ReadWriteCloser, error)
    }
    

    现在让我们更改函数:

    func handleConnection(us net.Conn, backend BA.Backend, d Dialer) {
        // ...
    
        // Code here stays
        ds, err := d.Dial("tcp", backend.String());if err != nil {
            log.Printf("failed to dial %s: %s", backend, err)
            us.Close()
            return
        }
        // ...
    }
    

    netDialer 它包裹着 net.Dial() testDialer bytes.Buffer .

    模拟网络连接而不输入网络拨号