在 Tcp 连接列表器中延迟的目的是什么



我最近开始学习TCP,我了解defer在文件创建和其他方面的工作原理,但我不了解在TCP中使用defer的原因是,当服务器侦听传入请求时,它就像一个无限循环,因此TCP从未停止侦听请求,除非它被命令行中断。

以下面的代码为例:

package main
import (
"fmt"
"log"
"net"
)
func listenConnection(conn net.Conn) {
for {
buffer := make([]byte, 1400)
size, err := conn.Read(buffer)
if err != nil {
fmt.Printf("Connection closed")
return
}
data := buffer[:size]
fmt.Printf("recieved message %s", data)
_, err = conn.Write(data)
if err != nil {
log.Fatalln(err)
}
}
}
func main() {
fmt.Println("Listening to localhost:5000")
listener, err := net.Listen("tcp", "localhost:5000")
if err != nil {
log.Fatalln(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
log.Fatalln(err)
}
fmt.Println("New connection")
go listenConnection(conn )
}
}

defer语句在这种情况下是如何工作的?

它在任何上下文中都是一样的:它在完成包含函数时执行。在这种情况下,当main()终止时,将运行延迟函数。

你的困惑似乎是围绕着main()中有一个无限循环的想法。实际上没有:当listener.Accept()返回错误时,循环将终止,因为随后会调用log.Fatal,从而终止整个程序。

最新更新