Networking 被拒绝的tcp连接不返回错误
我在Golang net软件包上做了一些实验 当我使用客户端连接服务器时(没有紧密连接),我发现服务器出现如下错误: “打开的文件太多” 这很有意义,因为我的操作系统中设置了文件打开限制 然而,我发现当连接到服务器时,客户端从未返回错误,这很奇怪,因为服务器已经拒绝了一些连接请求Networking 被拒绝的tcp连接不返回错误,networking,tcp,go,Networking,Tcp,Go,我在Golang net软件包上做了一些实验 当我使用客户端连接服务器时(没有紧密连接),我发现服务器出现如下错误: “打开的文件太多” 这很有意义,因为我的操作系统中设置了文件打开限制 然而,我发现当连接到服务器时,客户端从未返回错误,这很奇怪,因为服务器已经拒绝了一些连接请求 // Server code package main import ( "log" "net" ) func main() { listener, err := net.Listen("t
// 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)
}
}
谁能告诉我这里发生了什么
thx.在服务器应用程序接受TCP/IP堆栈之前,TCP握手是由内核TCP/IP堆栈在服务器上异步执行的,因此即使您的服务器代码无法接受连接,它也将在TCP级别进行连接。这就是net.Dial()成功的原因 当服务器代码接受连接失败时,TCP/IP堆栈将关闭连接
net.Write()只将数据传递到本地TCP/IP堆栈,该堆栈将异步发送数据。如果这是在服务器代码有机会(未能)接受连接之前完成的,则不会出现错误,因为tcp连接仍在运行。如果您的客户执行2。net.write()也应该失败,或者等待一段时间。你说得对。那么,我如何确保(或知道)消息已经发送并到达对等服务器?即使服务器不响应任何内容,我也可以知道吗?TCP堆栈中的ACK对用户可见吗?TCP ACK不可见,不可见。如果您想知道远程应用程序已接收/处理该消息,远程应用程序需要告诉您它已接收/处理该消息。也就是说,您需要在TCP之上实现自己的协议,并让它发送某种“ACK”消息。在写入数据之前,我能知道客户端无法连接到服务器吗?是否有类似connect.Ok()的内容?@user3619782如果无法建立TCP连接,net.Dial()将返回一个错误。但正如您所发现的,还有许多其他情况,如本文所述,也可能导致故障,如果不向另一端传输任何信息,您无法了解其中的许多情况。