梁越

网络编程学习笔记6-TCP正确使用

0 人看过

正确关闭TCP连接,视频p17

TCP建立的难度小于销毁的难度,服务端建立TCP的难度小于客户端,接收TCP的难度小于发送

TCP缓冲区里还有数据就关闭连接会导致数据丢失

安全关闭TCP的例子

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 %s\n", 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 %s\n", filename);

    //正确关闭TCP连接
    printf("Shutdown write and read until EOF\n");
    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完将丢失