gpt4 book ai didi

Go 中的 TCP 连接

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:43 26 4
gpt4 key购买 nike

这是我的代码:

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

最佳答案

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

A server may create several concurrently established TCP sockets with the same local port number and local IP address, each mapped to its own server-child process, serving its own client process. They are treated as different sockets by the operating system, since the remote socket address (the client IP address and/or port number) are different; i.e. since they have different socket pair tuples.

如果您从另一个角度考虑它,即传出连接,您不会觉得看到远程地址在许多套接字上相同(例如 google.com:80)很奇怪,所以同样适用于传入连接。

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

关于Go 中的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28798964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com