muduo 的 shutdown()没有直接关闭 TCP连接的原因

今天收到一位网友来信:

在 simple 中的 daytime 示例中,服务端主动关闭时调用的是如 下函数序列,这不是只是关闭了连接上的写操作吗,怎么是关闭了整个连接?

1: void DaytimeServer::onConnection(const muduo::net::TcpConnectionPtr& conn)

2: {

3:   if (conn->connected())

4:   {

5:     conn->send(Timestamp::now().toFormattedString() + "\n");

6:     conn->shutdown();

7:   }

8: }

9:

10: void TcpConnection::shutdown()

11: {

12:   if (state_ == kConnected)

13:   {

14:     setState(kDisconnecting);

15:     loop_->runInLoop(boost::bind(&TcpConnection::shutdownInLoop, this));

16:   }

17: }

18:

19: void TcpConnection::shutdownInLoop ()

20: {

21:   loop_->assertInLoopThread();

22:   if (! channel_->isWriting())

23:   {

24:     // we are not writing

25:     socket_->shutdownWrite();

26:   }

27: }

28:

29: void Socket::shutdownWrite()

30: {

31:   sockets::shutdownWrite(sockfd_);

32: }

33:

34: void sockets::shutdownWrite (int sockfd)

35: {

36:   if (::shutdown(sockfd, SHUT_WR) < 0)

37:   {

38:     LOG_SYSERR << "sockets::shutdownWrite";

39:   }

40: }

时间: 2024-10-07 13:53:03

muduo 的 shutdown()没有直接关闭 TCP连接的原因的相关文章

java httpclient发送请求后,不关闭tcp连接,如何通过tcp连接发送数据

问题描述 在做一个模拟用户在线的操作,网站有在线人数统计功能,对网站抓包时发现,用户登录后tcp连接没有关闭,他判断用户是否在线,是每45s通过tcp连接发送数据,并没有重新发送http请求.那么httpclient该怎么实现这个功能 解决方案

《Linux高性能服务器编程》——3.3 TCP连接的建立和关闭

3.3 TCP连接的建立和关闭 本节我们讨论建立和关闭TCP连接的过程. 3.3.1 使用tcpdump观察TCP连接的建立和关闭 首先从ernest-laptop上执行telnet命令登录Kongming20的80端口,然后抓取这一过程中客户端和服务器交换的TCP报文段.具体操作过程如下: $ sudo tcpdump -i eth0 –nt '(src 192.168.1.109 and dst 192.168.1.108) or (src 192.168.1.108 and dst 192

高性能网络编程4&amp;#8211;TCP连接的关闭

作者:陶辉 TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么. 为方便阅读,我们可以带着以下5个问题来阅读本文: 1.当socket被多进程或者多线程共享时,关闭连接时有何区别? 2.关连接时,若连接上有来自对端的还未处理的消息,会怎么处理? 3.关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理? 4.so_linger这个功能的用处在哪? 5.对于监听socket执行关闭,和对处于ESTABLISH这种通讯的socket执行

基础教程:TCP连接的建立和释放

TCP首部格式 先看TCP报文段的格式,如下; TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项.因此TCP报文段的最小长度为20个字节. 首部固定部分的各字段的意义如下: 1.源端口和目的端口:加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接.另外通过目的端口来决定TCP将数据报交付于那个应用程序,从而实现TCP的分用功能. 2.序号:占4个字节,序号的范围为[0,4284967296].由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每

linux下2个检查tcp连接的命令_linux shell

1 检测web服务器的链接数量及状态: netstat -ant|awk '{print $5 "\t" $6}'|grep "::ffff:"|sed -e 's/::ffff://' -e 's/:[0-9]*//' |sort|uniq -c| sort -rn|head -10 结果: 122 125.162.71.199 TIME_WAIT 99 79.119.125.43 TIME_WAIT 81 125.167.243.77 TIME_WAIT 75

tcp连接-TCP连接关闭时怎么少了一次挥手ACK

问题描述 TCP连接关闭时怎么少了一次挥手ACK 1) 先启动tcpdump抓包 tcpdump -p -vv -s 0 -w capture.pcap host 42.62.41.195 2) 利用telnet登陆"水木"社区来观察TCP的3次握手连接建立和4次挥手连接关闭 telnet 42.62.41.195 3) 用wireshark分析抓取的封包capture.pcap发现TCP连接关闭时少了1次挥手ACK

如何才能正确的关闭Socket连接

从TCP协议角度来看,一个已建立的TCP连接有两种关闭方式,一种是正常关闭,即四次挥手关闭连接:还有一种则是异常关闭,我们通常称之为连接重置(RESET).首先说一下正常关闭时四次挥手的状态变迁,关闭连接的主动方状态变迁是FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT,而关闭连接的被动方的状态变迁是CLOSE_WAIT->LAST_ACK->TIME_WAIT.在四次挥手过程中ACK包都是协议栈自动完成的,而FIN包则必须由应用层通过closesocket或sh

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.6 TCP连接的建立和终止

2.6 TCP连接的建立和终止 为帮助大家理解connect.accept和close这3个函数并使用netstat程序调试TCP应用,我们必须了解TCP连接如何建立和终止,并掌握TCP的状态转换图. 2.6.1 三路握手建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成,我们称之为被动打开(passive open). (2)客户通过调用connect发起主动打开(active open).这导致客户T

常用类之TCP连接类-socket编程_C#教程

tcp一般用于维持一个可信任的连接,比起udp更为安全可靠,在vs.net,分别有tcpclient和udpclient以及tcplistener,一般开发中基本可以满足需要,但是这个有个很大的弊端,对于维持一个时间较长的,相互交互的来说,数据处理不是很明朗,vs/net中还有一个socket类,用他来做一个客户/服务器段,同时在接发数据的时候,能相互独立,这需要一个异步通讯过程 先实现服务器段: using System; using System.Net; using System.Net.