我的编程空间,编程开发者的网络收藏夹
学习永远不晚

服务器如何知道客户端不再存在?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

服务器如何知道客户端不再存在?

问题内容

我试图了解 TCP 的工作方式,到目前为止我所知道的是,如果“随机”断开连接,一侧无法知道另一侧是否仍然存在。这就是使用一些 PING/PONG 算法或 TCP keep-alive 的原因。我创建了一个简单的客户端-服务器应用程序,其中客户端连接到服务器,并在 10 秒后发送一条简单的消息。让我困惑的是,在以下两种情况下,服务器如何知道客户端不再存在:

  1. 我让程序完全运行并完成 - 在这种情况下,服务器关闭连接(我不明白服务器如何知道客户端不再存在,我没有在客户端的任何地方指出我正在关闭连接)
  2. 我在完成之前关闭了客户端进程(在它向服务器发送消息之前) - 在这种情况下,服务器打印以下消息 Error Reading: read tcp 127.0.0.1:8080->127.0.0.1:60845 : wsarecv: 现有连接被远程主机强行关闭. (同样,我不明白它如何知道客户端不再存在)

我假设操作系统(或 golang net 库)参与其中,并且它在 TCP 连接真正关闭之前发送附加消息或类似的消息来处理这种情况。

欢迎任何帮助。下面是我使用的完整代码,因此您可以在本地或在线 Go Playground 中运行它。

client.go

package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    // Connect to the server
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        fmt.Println("Error connecting:", err)
        return
    }
    defer conn.Close()

    // Send a message to the server
    message := "Hello from client!"
    time.Sleep(10000 * time.Millisecond)
    conn.Write([]byte(message))

    // Read the response from the server
    buffer := make([]byte, 1024)
    n, err := conn.Read(buffer)
    if err != nil {
        fmt.Println("Error reading:", err)
        return
    }

    // Print the server's response
    fmt.Printf("Received response from server: %s\n", buffer[:n])
}

服务器.go

package main

import (
    "fmt"
    "net"
)

func handleConnection(conn net.Conn) {
    defer conn.Close()

    // Obtain and print the client's IP address when the connection is established
    clientAddr := conn.RemoteAddr()
    fmt.Printf("Client connected from IP address: %s\n", clientAddr)

    for {
        // Read data from the client
        buffer := make([]byte, 1024)
        n, err := conn.Read(buffer)
        if err != nil {
            fmt.Println("Error reading:", err)
            return
        }

        // Print received message
        fmt.Printf("Received message from client (%s): %s\n", clientAddr, buffer[:n])

        // Send a response back to the client
        response := "Hello from server!"
        conn.Write([]byte(response))
    }
}

func main() {
    // Start listening on a port
    listener, err := net.Listen("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println("Error listening:", err)
        return
    }
    defer listener.Close()

    fmt.Println("Server listening on port 8080")

    for {
        // Wait for a connection
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }

        // Handle the connection in a goroutine
        go handleConnection(conn)
    }
}

正确答案


我意识到我正在谈论一些我不太熟悉的事情,所以我自己测试了它。玩具示例,在同一台机器上的三个独立终端中:

监督:sudo tcpdump -tttt -i lo port 8887(您可能需要找出您的本地主机设备是什么,也许是 lo0,使用 sudo tcpdump -D。观察 Flags 字段:. 是 ACK,其他应该不言而喻。)

服务器:nc -l 8887

客户端:nc localhost 8887

  • 客户端:SYN
  • 服务器:SYN ACK
  • 客户端:ACK

在客户端中输入内容并按 Enter

  • 客户端:PSH ACK
  • 服务器:ACK

在服务器中输入内容并按 Enter

  • 服务器:PSH ACK
  • 客户端:ACK

a) 停止客户端,无论是通过 ctrl-c 还是 sigkill:

  • 客户端:FIN ACK
  • 服务器:FIN ACK
  • 客户端:ACK

b) 停止服务器:

  • 服务器:FIN ACK
  • 客户端:ACK

然后停止客户端:

  • 客户端:FIN ACK
  • 服务器:RST

本实验是在 WSL/Ubuntu 上完成的。我还没有编译你的程序,但你可以自己测试你的场景。让我惊讶的一件事是,即使我 sigkilled 客户端进程,FIN 仍然被发送,这表明如果客户端进程以开放端口终止,则由内核负责发送 FIN。另外,当服务器端进程停止时,FIN 没有发送,这使得客户端遇到 RST 响应。

TCP 协议的内核实现负责处理这个问题;除了 conn.Close() 中发生的情况外,这与 Go 完全无关。

以上就是服务器如何知道客户端不再存在?的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

服务器如何知道客户端不再存在?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

服务器如何知道客户端不再存在?

问题内容我试图了解 TCP 的工作方式,到目前为止我所知道的是,如果“随机”断开连接,一侧无法知道另一侧是否仍然存在。这就是使用一些 PING/PONG 算法或 TCP keep-alive 的原因。我创建了一个简单的客户端-服务器应用程
服务器如何知道客户端不再存在?
2024-02-08

如何理解Fedora DNS服务器客户端

这篇文章将为大家详细讲解有关如何理解Fedora DNS服务器客户端,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。DNS有很多值得学习的地方,这里我们主要介绍DNS服务器,包括介绍DNS服务
2023-06-16

云服务器如何使用ssr客户端

使用SSR客户端可以很方便地在云服务器上创建和管理数据库。以下是一些示例:创建新的数据库连接:首先,在您的云服务上创建一个新的数据库连接。在连接上添加“openservers”选项,然后将“openserver”设置为您要连接的云服务的主机名。如果您要连接的主机名是“test_server”或“test.sources”,则可以将其替换为您的云服务器的主机名。创建新的数据库:选择您的数据库文件所在的路径和文件名
2023-10-27

如何使用java实现客户端与服务器

小编给大家分享一下如何使用java实现客户端与服务器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1. web开发;2.
2023-06-14

云服务器如何使用ssr客户端登录

在ssr客户端上,你可以使用多种方式登录到云服务器中。以下是其中几种方法:1.使用ssr登录到控制台:使用ssr客户端上的控制台登录功能,在控制台上输入要登录的账号和密码即可登录到云服务器中。在控制台上还可以使用其他的ssr客户端,例如openssl等。2.使用ssr客户端上的ssr.openssl:使用ssr客户端上
云服务器如何使用ssr客户端登录
2023-10-28

TCP服务器在客户端重新连接时,内存持续增长

从现在开始,我们要努力学习啦!今天我给大家带来《TCP服务器在客户端重新连接时,内存持续增长》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!
TCP服务器在客户端重新连接时,内存持续增长
2024-04-04

如何使用Go实现TLS服务器和客户端

本篇内容介绍了“如何使用Go实现TLS服务器和客户端”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!传输层安全协议(Transport Lay
2023-06-22

WebSocket如何实现服务器消息推送客户端

这篇文章主要为大家展示了“WebSocket如何实现服务器消息推送客户端”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WebSocket如何实现服务器消息推送客户端”这篇文章吧。  一、背景  
2023-06-02

如何在客户端上成功登录阿里云MySQL数据库服务器

客户端登录阿里云mysql数据库服务器#简介:在本篇文章中,我们将详细介绍如何在客户端上成功登录阿里云MySQL数据库服务器。我们将讨论不同类型的客户端(如Windows,Mac,Linux等)以及所需的配置步骤,以便您可以轻松地访问您的数据库。详细说明:准备环境:在开始之前,请确保您已经具备以下环境条件:阿里云账号和
如何在客户端上成功登录阿里云MySQL数据库服务器
2024-01-25

阿里云服务器ecs位于云端,但是用户不存在

如果您正在使用阿里云的ECS服务器,但是您的计算机位于云端,这可能是由于云服务器的资源使用情况和配置方式导致的。在这种情况下,云服务器可以提供更强大的计算能力和更高的安全性,因此可能会更适合您的需求。如果您的计算机位于云端,您可以检查云服务器的相关配置文件,以查看是否有任何配置不当的情况。或者您可以尝试重启云服务器,以解决问题。在任何情况下,如果您遇到了计算机配置问题,请联系阿里云客服解决并获取帮
2023-10-26

ASP.NET中如何为服务器控件添加客户端功能

这篇文章主要介绍了ASP.NET中如何为服务器控件添加客户端功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ASP.NET控件开发基础之服务器控件客户端功能1.减轻服务器压
2023-06-18

python如何使用UDP实现客户端和服务器对话

这篇文章主要介绍“python如何使用UDP实现客户端和服务器对话”,在日常操作中,相信很多人在python如何使用UDP实现客户端和服务器对话问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何使
2023-07-05

在SSL连接中客户端和服务器之间如何协商加密算法

在SSL连接中,客户端和服务器之间会进行以下步骤来协商加密算法:客户端发送一个"ClientHello"消息给服务器,包含了支持的加密算法列表和其他信息。服务器收到客户端的"ClientHello"消息后,会从客户端提供的加密算法列表中选择
在SSL连接中客户端和服务器之间如何协商加密算法
2024-04-17

如何处理服务器上客户端断开连接的情况

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《如何处理服务器上客户端断开连接的情况》,聊聊,希望可以帮助到正在努力赚钱的你。问题内
如何处理服务器上客户端断开连接的情况
2024-04-05

阿里云服务器ecs位于云端,但是用户名不存在

如果您在阿里云网站上输入了错误的用户名或者密码,那么您可能无法使用阿里云服务器来登录您的云服务器。这种情况下,您可能需要更改您的云服务器密码或使用其他方式登录。阿里云服务器是由阿里巴巴集团提供的云服务器。在购买和使用服务器时,您需要提供相关的身份验证信息和授权。如果您无法提供相应的信息或授权,阿里云服务器可能无法为您提供服务。如果您遇到这种情况,您可以尝试联系阿里云客服或联系您的阿里云授权服
2023-10-26

编程热搜

目录