这是我的代码:
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
为什么listener
和conn
的地址相同?在TCP中,我认为为新连接创建了一个新套接字。
答案 0 :(得分:0)
不,您的侦听器正在接受端口8081中的连接,因此LocalAddr
将具有该端口。如果您拨出到另一台服务器,通常每次都使用不同的端口,但也不需要。
答案 1 :(得分:0)
让我困惑了一秒钟,但这是正确的。确实创建了一个新的套接字(具有唯一的本地+远程地址元组)。来自wikipedia的引用很好地描述了它:
服务器可以创建多个同时建立的具有相同本地端口号和本地IP地址的TCP套接字,每个套接字映射到其自己的服务器子进程,为其自己的客户端进程提供服务。它们被操作系统视为不同的套接字,因为远程套接字地址(客户端IP地址和/或端口号)不同;即因为它们有不同的套接字对元组。
如果你想到它的另一种方式,即传出连接,你会发现很奇怪看到远程地址在许多套接字中是相同的(例如google.com:80
),所以对于传入连接也是如此。< / p>
这可能是一个很好的副作用,就像netstat
这样的工具在检查套接字时很好地显示了源端口,而不是随机对。