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

Networking 被拒绝的tcp连接不返回错误,networking,tcp,go,Networking,Tcp,Go,我在Golang net软件包上做了一些实验 当我使用客户端连接服务器时(没有紧密连接),我发现服务器出现如下错误: “打开的文件太多” 这很有意义,因为我的操作系统中设置了文件打开限制 然而,我发现当连接到服务器时,客户端从未返回错误,这很奇怪,因为服务器已经拒绝了一些连接请求 // Server code package main import ( "log" "net" ) func main() { listener, err := net.Listen("t

我在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)

    }

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


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()将返回一个错误。但正如您所发现的,还有许多其他情况,如本文所述,也可能导致故障,如果不向另一端传输任何信息,您无法了解其中的许多情况。