【TCP协议】主动方关闭连接后不能继续接收数据?

博客探讨了TCP连接关闭过程中CLOSE-WAIT和FIN-WAIT2状态下的数据传输能力。通过Go和C语言的代码示例,展示了当服务端主动关闭连接后,客户端在CLOSE-WAIT状态尝试发送数据导致服务端返回RST的情况。解决方案是使用`shutdown`函数关闭写方向的连接,使得服务端能在FIN-WAIT2状态下接收数据。
摘要由CSDN通过智能技术生成

如果你搜过TCP的四次挥手相关信息,你一定会看到类似这样的话:“主动方选择关闭连接后,被动方马上回ACK,此时可以继续传输数据,传完后再发送FIN”

 (图片来源:CS-Notes/计算机网络 - 传输层.md at master · CyC2018/CS-Notes · GitHub

为了验证CLOSE-WAIT状态是否真的能发数据,我先是写了这样一段代码:

代码如下,大致效果是:启动一个TCP服务端和客户端,服务端accept连接后关闭,此时理论上应该进入FIN-WAIT-1阶段。然后客户端不关闭,尝试在CLOSE-WAIT阶段发送数据,看看服务端能否在FIN-WAIT2阶段接收到数据。

// main.go

package main

import (
	"net"
	"time"

	"github.com/sirupsen/logrus"
)

const (
	serverAddr = "127.0.0.1:6666"
)

func serverMain() {
	listener, err := net.Listen("tcp", serverAddr)
	if err != nil {
		panic(err)
	}

	conn, err := listener.Accept()
	if err != nil {
		panic(err)
	}
	go func() {
		time.Sleep(time.Second)
		conn.Close()
	}()

	go func() {
		for {
			buf := make([]byte, 100)
			n, err := conn.Read(buf)
			if err != nil {
				logrus.Errorf("cannot read %v", err)
				return
			}
			logrus.Infof("read:%v", buf[:n])
		}
	}()

	tim
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值