• 《TCP/IP网络编程》阅读笔记--基于 TCP 的半关闭


    目录

    1--基于TCP的半关闭

    1-1--TCP单方面完全断开的问题

    1-2--shutdown()函数

    1-3--半关闭的必要性

    2--基于半关闭的文件传输程序


    1--基于TCP的半关闭

    1-1--TCP单方面完全断开的问题

            Linux 系统中的 close 函数会将 TCP Socket 的连接完全断开,这意味着不能收发数据(关闭了输入流和输出流),这可能会导致主机 A 无法收到主机 B 的数据(主机A的输入流被关闭了); 

    1-2--shutdown()函数

    1. #include
    2. int shutdown(int sock, int howto);
    3. // 成功时返回 0, 失败时返回 -1
    4. // sock 表示需要断开的 Socket 的文件描述符
    5. // howto 表示传递断开的方式信息

            shutdown() 函数可以避免上面完全关闭导致数据丢失的问题,其通过指定断开的方式来选择性地断开输入流、输出流

            断开的方式通过第二个参数来指定,其中 SHUT_RD 表示断开输入流SHUT_WR 表示断开输出流SHUT_RDWR 表示同时断开 I/O 流

    1-3--半关闭的必要性

            对于服务器端/客户端的数据传输问题,传输文件的服务器端只需连续传输文件数据即可,但客户端无法知道何时结束数据的接收;

            为了解决上述问题,服务器端应向客户端传递一个 EOF 表示文件传输结束,而客户端通过接收到 EOF 知晓文件传递结束,可以停止接收数据

            断开输出流可以向外传递 EOF(无论是设置 SHUT_WR 还是直接使用 close() 函数);

    2--基于半关闭的文件传输程序

    服务器端:

    1. // gcc file_server.c -o file_server
    2. // ./file_server 9190
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #define BUF_SIZE 30
    10. void error_handling(char *message){
    11. fputs(message, stderr);
    12. fputc('\n', stderr);
    13. exit(1);
    14. }
    15. int main(int argc, char *argv[]){
    16. int serv_sd, clnt_sd;
    17. FILE* fp;
    18. char buf[BUF_SIZE];
    19. int read_cnt;
    20. struct sockaddr_in serv_adr, clnt_adr;
    21. socklen_t clnt_adr_sz;
    22. if(argc != 2){
    23. printf("Usage : %s \n", argv[0]);
    24. exit(1);
    25. }
    26. fp = fopen("file_server.c", "rb");
    27. serv_sd = socket(PF_INET, SOCK_STREAM, 0);
    28. memset(&serv_adr, 0, sizeof(serv_adr));
    29. serv_adr.sin_family = AF_INET;
    30. serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    31. serv_adr.sin_port = htons(atoi(argv[1]));
    32. bind(serv_sd, (struct sockaddr*)&serv_adr, sizeof(serv_adr));
    33. listen(serv_sd, 5);
    34. clnt_adr_sz = sizeof(clnt_adr);
    35. clnt_sd = accept(serv_sd, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
    36. while(1){
    37. read_cnt = fread((void*)buf, 1, BUF_SIZE, fp);
    38. if(read_cnt < BUF_SIZE){
    39. write(clnt_sd, buf, read_cnt);
    40. break;
    41. }
    42. write(clnt_sd, buf, BUF_SIZE);
    43. }
    44. shutdown(clnt_sd, SHUT_WR);
    45. read(clnt_sd, buf, BUF_SIZE);
    46. printf("Message from client: %s \n", buf);
    47. fclose(fp);
    48. close(clnt_sd);
    49. close(serv_sd);
    50. return 0;
    51. }

    客户端:

    1. // gcc file_client.c -o file_client
    2. // ./file_client 127.0.0.1 9190
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #define BUF_SIZE 30
    10. void error_handling(char *message){
    11. fputs(message, stderr);
    12. fputc('\n', stderr);
    13. exit(1);
    14. }
    15. int main(int argc, char *argv[]){
    16. int sd;
    17. FILE* fp;
    18. char buf[BUF_SIZE];
    19. int read_cnt;
    20. struct sockaddr_in serv_adr;
    21. if(argc != 3){
    22. printf("Usage : %s \n", argv[0]);
    23. exit(1);
    24. }
    25. fp = fopen("receive.dat", "wb");
    26. sd = socket(PF_INET, SOCK_STREAM, 0);
    27. memset(&serv_adr, 0, sizeof(serv_adr));
    28. serv_adr.sin_family = AF_INET;
    29. serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
    30. serv_adr.sin_port = htons(atoi(argv[2]));
    31. connect(sd, (struct sockaddr*)&serv_adr, sizeof(serv_adr));
    32. while((read_cnt = read(sd, buf, BUF_SIZE)) != 0){
    33. fwrite((void*)buf, 1, read_cnt, fp);
    34. }
    35. puts("Received file data");
    36. write(sd, "Thank you", 10);
    37. fclose(fp);
    38. close(sd);
    39. return 0;
    40. }

    运行结果:

  • 相关阅读:
    leetcode分类刷题:队列(Queue)(三、优先队列用于归并排序)
    数据分析Pandas专栏---第三章<Pandas合并list和字典>
    代码都成屎山了,还在用if-else?不如试试我的这套工厂模式+Map+自定义注解+枚举
    带你了解NLP的词嵌入
    让图像恢复的baselines简单点 [2022ECCV】
    springmvc中的类型转换&数据格式化&数据验证
    外汇天眼:本周无牌裸奔平台名单出炉,你踩“坑”了么?!!
    PostgreSQL数据库----pgAdmin客户端工具的使用
    创建Maven项目,完成项目的清理、编译、测试、打包等生命周期流程,给出操作及最终jar(war)包截图
    是真是假,AI可根据声音检测是否感染新冠 准确率达89%
  • 原文地址:https://blog.csdn.net/weixin_43863869/article/details/132719338