首页 > 解决方案 > 从 net.Conn 检索 uri 路径

问题描述

我正在使用其他人的代码,我需要一些帮助。

这里我们有一个 tcp 负载均衡器。我需要的是在我们进行网络拨号之前从这段代码中访问请求 uri 。

我在这里查看了 API 文档:https ://golang.org/pkg/net/但无法在net.Conn命名空间下找到任何相关方法来检索当前请求路径。

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
    }           

    ip:=us.RemoteAddr().String()
    parts:=strings.Split(ip,":")
    ip=parts[0]

    //w := bufio.NewWriter(us)
    //w.WriteString(+"\n")
    //w.Flush()    
    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
}

标签: gotcprequest

解决方案


这是不可能的,因为不是每个 TCP 连接都是 HTTP 连接,而且 TCP 协议没有 URI 的概念。许多其他协议都是建立在 TCP 之上的,而了解它们不是该协议的责任。

HTTP 是一种应用层(第 7 层)协议,它使用TCP 传输层(第 4 层)协议。因此,TCP 连接没有 HTTP 的概念,因为较低层协议没有可能构建在它们之上的层的概念。

您可以通过阅读有关OSI 模型的信息来了解更多信息。


推荐阅读