Go中的TCP连接

这是我的代码:

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中,我认为为新连接创建了一个新套接字。

回答:

这让我困惑了一秒钟,但这是正确的。确实创建了一个新的套接字(具有唯一的本地+远程地址元组)。维基百科的这段引文很好地描述了它:

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

如果您以其他方式(即传出连接)进行考虑,则看到许多套接字(例如google.com:80)之间的远程地址相同,则不会感到奇怪,因此传入连接也是如此。

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

以上是 Go中的TCP连接 的全部内容, 来源链接: utcz.com/qa/404361.html

回到顶部