正确关闭TCP连接,视频p17
TCP建立的难度小于销毁的难度,服务端建立TCP的难度小于客户端,接收TCP的难度小于发送
TCP缓冲区里还有数据就关闭连接会导致数据丢失
安全关闭TCP的例子
代码语言:javascript复制void sender(const char* filename, TcpStreamPtr stream)
{
FILE* fp=fopen(filename, "rb");
if(!fp)
return;
printf("Sleeping 10 seconds.n");
sleep(10);
printf("Start sending file %sn", filename);
char buf[8192];
size_t nr=0;
while(nr=fread(buf, 1, sizeof(buf), fp > 0))
{
stream->sendAll(buf, nr);
}
fclose(fp);
printf("Finish sending file %sn", filename);
//正确关闭TCP连接
printf("Shutdown write and read until EOFn");
sream->shutdownWrite(); //如果不在这关闭写端,会导致TCP会提前关闭
while(nr=stream->receiveSome(buf, sizeof(buf)) > 0)
{
//do something
}
printf("All done");
//接收完文件后再断开TCP连接
}
在传输文件的时候,输入一些数据,将导致tcp连接断开,服务端接收的数据不完整
如果客户端发送完数据后,断开TCP的写服务,可以解决这个问题,在客户端再输入一些数据时不会影响服务端接收文件
完整的传输和不完整的传输流程分别为:
send()->shutdown->read()->close
send()->more data->close() //如果数据没read完将丢失