【问题标题】:TCP Connections in GoGo 中的 TCP 连接
【发布时间】:2015-05-02 03:58:44
【问题描述】:

这是我的代码:

package main                                                                       

import (                                                                           
    "fmt"                                                                          
    "net"                                                                          
)                                                                                  

func main() {                                                                      
    addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081")                         
    listener, _ := net.ListenTCP("tcp", addr)                                      
    fmt.Printf("listener addr: %s\n", listener.Addr().String())                    
    for {                                                                          
        conn, err := listener.AcceptTCP()                                          
        if err != nil {                                                            
            // handle error                                                        
            fmt.Println("err")                                                     
            return                                                                 
        }                                                                          
        go handleConnection(conn)                                                  
    }                                                                              
}                                                                                  

func handleConnection(conn *net.TCPConn) {                                         
    fmt.Printf("conn addr: %s\n", conn.LocalAddr().String())                       
    fmt.Printf("conn remote addr: %s\n", conn.RemoteAddr().String())               
}  

输出

listener addr: 127.0.0.1:8081
conn addr: 127.0.0.1:8081
conn remote addr: 127.0.0.1:1234

为什么listenerconn 有相同的地址?在 TCP 中,我认为为新连接创建了一个新套接字。

【问题讨论】:

    标签: tcp go network-programming


    【解决方案1】:

    这让我困惑了一秒钟,但这是正确的。确实创建了一个新套接字(具有唯一的本地+远程地址元组)。 wikipedia 的这句话描述得很好:

    服务器可以创建多个同时建立的具有相同本地端口号和本地 IP 地址的 TCP 套接字,每个都映射到自己的服务器子进程,为自己的客户端进程提供服务。它们被操作系统视为不同的套接字,因为远程套接字地址(客户端 IP 地址和/或端口号)不同;即因为它们有不同的套接字对元组。

    如果您换一种方式考虑,即传出连接,您不会觉得在许多套接字上看到远程地址相同(例如google.com:80)并不奇怪,因此传入连接也是如此。

    这样做的一个很好的副作用可能是像netstat 这样的工具在检查套接字时可以很好地显示源端口,而不是随机对。

    【讨论】:

      【解决方案2】:

      不,您的侦听器正在接受端口 8081 中的连接,因此 LocalAddr 将拥有该端口。如果您拨出到另一台服务器,通常每次都使用不同的端口,但这也不是必需的。

      【讨论】:

        猜你喜欢
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 2014-09-25
        • 2019-09-23
        • 2020-06-07
        相关资源
        最近更新 更多