首页 > 编程语言 >TCPIP网络编程 -- (五)基于 TCP 的服务端客户端(2)

TCPIP网络编程 -- (五)基于 TCP 的服务端客户端(2)

时间:2023-03-14 17:34:45浏览次数:40  
标签:-- 缓冲 TCP read len message recv 服务端

TCP/IP网络编程 -- (五)基于 TCP 的服务端/客户端(2)

5.1回声服务器的完美实现

由于上一章末尾提到的问题

write(sock, message, strlen(message));
str_len = read(sock, message, BUF_SIZE - 1);
message[str_len] = 0;
printf("Message from server: %s", message);
  1. client 多次发送的数据被被一次性传给了 server,于是回传的时候把多条信息一起发过来了
  2. client 一次发送的数据太长,可能多次 write 才能写完,操作系统把数据分为了多个数据包,client 在没有收完所有数据包的时候就调用了read,于是把一条信息分成了多条打印出来

因此如果可以提前知道 client 一共要收多少字节的数据,就可以等全部收完了再打印

str_len = write(sock, message, strlen(message));
recv_len = 0;
while(recv_len < str_len) {
    recv_cnt = read(sock, &message[recv_len], BUF_SIZE - 1);
    if (recv_cnt == -1)
        error_handling("read() error");
    recv_len += recv_cnt;
}
message[str_len] = 0;
printf("Message from server: %s", message);

但这是基于回声服务器的方法,正常情况下客户端并不会事先知道要接收多少数据,因此需要靠应用层协议来解决,即解决粘包问题,例如 HTTP 设置回车符,换行符作为 HTTP header 的边界,用 Content-lenth 字段作为 HTTP body 的边界

《TCP/IP网络编程》中定义了一种简单的应用层协议来解决,思路是固定各类信息的长度,消息长度的信息也再服务器与客户端之间发送

5.2TCP原理

write函数调用后并非立即传输数据,而是将数据移至输出缓冲;

read函数调用后并非立即接受数据,而是将数据移至输入缓冲;

image

数据在在恰当的时候从字节的输出缓冲传入对方的输入缓冲

这些缓冲I/O的特点为

  1. I/O缓冲在每个TCP socket 中单独存在
  2. I/O缓冲在创建 socket 时自动生成
  3. 即使关闭 socket 也将继续输出缓冲中遗留的数据
  4. 关闭 socket 将丢失输入缓冲中的数据

TCP是全双工的,一个 socket 会创建如上图所示的两个流

标签:--,缓冲,TCP,read,len,message,recv,服务端
From: https://www.cnblogs.com/hzy717zsy/p/17215672.html

相关文章

  • Swift 中 extension 的使用
    在Swift中,extension是一种非常有用的语言特性,它可以为一个已有的类型(包括类、结构体和枚举)添加新的属性、方法、下标和协议等功能,而无需修改原始类型的定义。使用exten......
  • ShowDoc在线API文档
    官方文档: https://www.showdoc.com.cn/helpdocker部署说明:#原版官方镜像安装命令(中国大陆用户不建议直接使用原版镜像,可以用后面的加速镜像)dockerpullstar7th......
  • MIT 6.824-Lab1. MapReduce 实现思路
    参考资料MapReduce论文((20221029103443-4pqvf1n"Lecture-MapReduce"))Lab1实验文档Lab1实验文档译文任务需求在一个分布式存储系统上(实验是单机),实现coord......
  • 800. 数组元素的目标和(双指针,二分)
    https://www.acwing.com/problem/content/802/二分:枚举a,对于每一个a[i],都二分一下求x-a[i],是否在b数组中#include<iostream>usingnamespacestd;constintN=1......
  • 测试
    这是一个测试做测试#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"structpos{intday,night;};boolcmp(posa,p......
  • 3月10日记录
    计划[]一定要把crapapi跑起来[]学习js[]学习java执行09点58分 开始工作11点16分 太恶心了,不行啊11点19分 再试一次13点39分 重新下载别的版本进行部署16点22分 ​​解......
  • 「微隔离」防范威胁横向渗透的利器!
    随着云计算、虚拟化技术的快速发展,数据中心内部网络架构从传统的IT架构向虚拟化、混合云和容器化升级变迁。传统的云安全产品,往往将防护重点放在网络边界进行防护,无法根据业......
  • 广东互联网医院系统开发|智慧医院系统|线上问诊系统
     广东互联网医院系统开发|智慧医院系统|线上问诊系统|广州市|深圳市|佛山市|东莞市|中山市|珠海市|江门市|肇庆市|惠州市|汕头市|潮州市|揭阳市|汕尾市|湛江市|茂名市|阳......
  • 滚珠丝杆磨损的原因
    随着滚珠丝杆的需求量不断增大,市面上也是出现了各种各样的滚珠丝杆品牌,有些厂家为了销量,甚至于打出了“无磨损”的噱头,事实上,丝杆要做到无磨损是不太可能的事情。相反的,滚珠......
  • 配置nginx虚拟主机
    挂载系统光盘将系统光盘挂载到mnt目录删除系统自带源配置文件yum源安装nginx依赖程序卸载系统盘切换到云计算光盘挂载nginx源代码程序解压源代码程序配置nginx服务器端编译......