gpt4 book ai didi

networking - 被拒绝的 tcp 连接不返回错误

转载 作者:IT王子 更新时间:2023-10-29 02:06:02 27 4
gpt4 key购买 nike

我在 Golang net 包上做了一些实验。

当我使用客户端连接服务器时(没有关闭连接),我发现服务器有这样的错误:“打开的文件太多”这是有道理的,因为我的操作系统中设置了文件打开限制。

但是,我发现客户端在连接到服务器时从未返回错误,这很奇怪,因为服务器已经拒绝了一些连接请求。

// Server code
package main

import (
"log"
"net"
)

func main() {
listener, err := net.Listen("tcp", "localhost:7070")
if err != nil {
log.Fatalln(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Println(err, conn)
continue
}
}
}


// Client code
package main

import (
"log"
"net"
)

func main() {
cnt := 0
for {
conn, err := net.Dial("tcp", "localhost:7070")
if err != nil {
log.Println("!", conn.RemoteAddr())
continue
}
cnt++
n, err := conn.Write([]byte("hello"))
if err != nil {
log.Fatalln(err)
}

log.Println(cnt, n)

}

}

谁能告诉我这里发生了什么?

谢谢。

最佳答案

TCP 握手是在服务器应用程序接受它之前由内核 TCP/IP 堆栈在服务器上异步执行的,因此即使您的服务器代码无法接受连接,它也会在 TCP 级别连接。这就是 net.Dial() 成功的原因。

当您的服务器代码接受连接失败时,TCP/IP 堆栈将关闭连接。

net.Write() 只是将数据传递到本地 TCP/IP 堆栈,后者将异步发送数据。如果这是在服务器代码有机会(未能)接受连接之前完成的,则不会出现错误,因为 tcp 连接仍在运行。如果您的客户端执行 2. 写入,或者可能稍等片刻,net.Write() 也应该会失败。

关于networking - 被拒绝的 tcp 连接不返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23561040/

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