【发布时间】:2012-03-26 09:12:39
【问题描述】:
我们知道:
/////////////////////////////////////// //////////
close() 将终止 tcp 连接上的两个方向
shutdown() 可以阻止一个或两个方向的通信
/////////////////////////////////////// //////////
这里,让我感到困惑的是 tcp stack 是如何区分它们的?
我已经写了一个示例程序:
首先我使用:
....
connect(192.168.1.100) //there is a server process running in 192.168.1.100
....
close(socketfd);
sleep(1000);
然后我使用wireshark转储数据包:
01 -->syn
02 <--syn,ack
03 -->ack
04 -->fin,ack
05 <--ack
netstat -an |grep 192.168.1.100
我已经运行了大约 5 分钟,它打印出来了:
一开始是"tcp 0 0 ... FIN_WAIT2",大约2分钟后没有输出,好像连接被破坏了。
然后,我使用:
....
connect(192.168.1.100)
....
shutdown(socketfd,SHUT_WR);
sleep(1000);
使用wireshark转储数据包:
01 -->同步
02
03 -->确认
04 -->fin,ack
05
...
netstat -an |grep 192.168.1.100
运行大约 10 分钟,它总是打印: “tcp 0 0 ... FIN_WAIT2”
从wireshark的输出来看,close和shutdown似乎没有区别,
但是从 netstat 的输出来看,它的行为是不同的。
那么为什么行为不同?
【问题讨论】:
标签: tcp