在客户端/服务器应用程序中,不同长度的文本数据将在客户端和服务器之间来回发送,我应该如何标记正在发送的数据包的结尾?例如,当服务器从客户端接收分组数据时,服务器如何知道客户端分组已完全被接收?
是否更常见的是告诉服务器它将在数据之前接收的数据包的全长或是否有标记数据包末尾的内容?
发送的一些数据只有几个字符长,有些可能是数千个字符.
我们知道:
////////////////////////////////////////////////// ///////
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);
Run Code Online (Sandbox Code Playgroud)
然后我使用wireshark来转储数据包:
01 -->syn
02 <--syn,ack
03 -->ack
04 -->fin,ack
05 <--ack
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
使用wireshark转储数据包:
01 - >同义词
02 < - syn,ack
03 - >确认
04 - > fin,ack
05 < - ack
...
netstat -an | grep 192.168.1.100
运行大约10分钟,它总是打印:"tcp 0 0 …