【发布时间】:2021-10-10 17:16:06
【问题描述】:
这个无限的for循环如何不崩溃?
我想如果现在没有客户端,listener.Accept() 方法会抛出一个错误,这使得 if 条件为真,for 循环继续进行另一个迭代,直到客户端连接到服务器。因此,我将fmt.Println("Error") 放在 if 语句中,看看它是否像我猜测的那样工作。但事实并非如此。它没有打印“错误”,因此当没有客户端时,程序不会进入 if 语句。
有人能解释一下这个 for 循环是如何工作的吗?
func main() {
service := ":1202"
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkError(err)
listener, err := net.ListenTCP("tcp4", tcpAddr)
checkError(err)
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error")
continue
}
}
}
【问题讨论】:
-
你看
listener.Accept()做了什么吗? -
在文档中,它说“接受等待并将下一个连接返回给侦听器”,所以在有客户端之前它永远不会被调用?
-
接受将等到客户端连接。
-
在有客户端之前,它永远不会返回,(或发生一些错误)。
-
如果你连接得足够多,你要么吃掉你所有的内存,要么吃掉你所有的文件描述符。
标签: go tcp infinite-loop