当前位置: 首页 > news >正文

哪个网站可以做优惠券建设项目环保备案登记网站

哪个网站可以做优惠券,建设项目环保备案登记网站,如何建立一个视频网站,linux一键安装wordpress在上一篇文章中#xff0c;我们学习了Socket编程的基础知识#xff0c;包括创建Socket、绑定地址、监听连接、接收连接等操作。然而#xff0c;真正的套接字编程远不止于此。本文将重点介绍TCP 流式协议#xff0c;什么是粘包问题#xff1f;如何解决粘包问题 #xff1f… 在上一篇文章中我们学习了Socket编程的基础知识包括创建Socket、绑定地址、监听连接、接收连接等操作。然而真正的套接字编程远不止于此。本文将重点介绍TCP 流式协议什么是粘包问题如何解决粘包问题 以及recv()和send()这两个函数详细介绍它们分别用于读取和发送数据是网络编程中最为关键的环节。我们将详细剖析函数原型、参数含义并通过实例代码展示具体用法助你彻底掌握数据传输的精髓。 想详细了解socket 编程基础知识的同学请前往查阅Socket编程权威指南(一)打通网络通信的任督二脉。 我们先来回顾一下 socket 编程的基本流程 接下来开始我们今天的正题。 一、TCP 流式协议 1、TCP 流式协议介绍 TCP传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。 以下是 TCP 作为流式协议的一些关键特性和详细说明 面向连接 TCP 需要在数据传输开始前建立一个连接。通过三次握手过程客户端和服务器交换初始序列号建立稳定的连接。 字节流 与数据报如 UDP不同TCP 将数据视为字节流而不是独立的数据包。这意味着 TCP 不保留数据包边界应用程序需要自己处理数据的边界。 可靠性 TCP 保证数据的可靠传输。它使用序列号和确认应答机制来确保数据按顺序、完整地到达目的地。 有序性 TCP 保证数据包的有序传输。如果数据包丢失或乱序TCP 会重传丢失的数据包并重新排序。 拥塞控制 TCP 内置拥塞控制机制通过调整数据的发送速率来避免网络拥塞。这是通过算法如慢启动、拥塞避免、快重传和快恢复实现的。 流量控制 TCP 使用滑动窗口机制进行流量控制接收方根据自己的接收能力告知发送方可以发送多少数据。 全双工通信 TCP 允许双向通信即客户端和服务器可以独立地发送和接收数据。 数据传输 TCP 通过套接字接口提供数据传输服务。应用程序可以使用 read()、write() 或专门的套接字系统调用如 recv() 和 send() 进行数据传输。 连接管理 TCP 连接的建立和终止通过三次握手和四次挥手过程管理。这些过程确保了连接的稳定建立和优雅关闭。 超时和重传 如果发送的数据没有得到及时确认TCP 会自动重传数据并且随着时间的推移重传间隔会指数增长。 保活和死锁检测 TCP 提供保活keepalive机制以检测死连接。如果连接长时间没有活动TCP 可以自动关闭连接。 适用场景 TCP 适用于需要可靠传输的应用如 Web 浏览HTTP、文件传输FTP、邮件传输SMTP和远程登录SSH。 限制 由于 TCP 是面向连接的协议它在某些场景下可能不如 UDP 高效特别是在实时通信或广播通信中。 编程模型 TCP 编程通常涉及创建套接字、绑定、监听、连接、数据传输和关闭连接等步骤。 TCP 作为流式协议其设计目标是提供可靠的数据传输服务。它通过多种机制确保数据的正确、有序传输并通过拥塞控制和流量控制适应不同的网络条件。 也就是说内核实现的
TCP 协议将保证将一个
TCP 包发送给另一端。 如上图 拥塞控制是确保可靠数据传输协议有效运作的关键组成部分因此在TCP中发送缓冲区和接收缓冲区成为了必不可少的元素。 在标准的Linux操作系统中TCP的发送缓冲区和接收缓冲区默认的大小通常被设置为208KB。这意味着如果进程A没有及时从其接收缓冲区中提取数据那么传入的数据将继续在缓冲区内积累直至达到其容量上限。 2、TCP 流式协议引发“粘包问题” 在网络上传输的数据本质上是二进制格式的这意味着接收缓冲区里存放的内容同样是以二进制数据的形式存在。 数据根据其到达的顺序被依次放入接收缓冲区这就可能导致所谓的“粘包”现象。 “粘包”这个词更像是一个方便描述的概念实际上它并非一个正式的术语。 这个说法类似于描述从水龙头流出的水“粘”在一起这当然不是字面上的粘连而是用来形象地表达数据包在缓冲区中连续存放的情况。 简而言之流式协议引发的一个问题是我们如何识别接收缓冲区中的数据分别属于哪个TCP数据包 以一个具体示例来说明如果客户端向服务器发送了三个TCP数据包分别包含内容QA、QB、QC每个内容代表一个不同的请求。那么在服务器端的接收缓冲区RecvBuffer中这些数据可能会连续排列成一串数据QAQBQC。服务器需要将这串连续的数据正确地拆分成三个独立的数据包并对每个数据包进行相应的处理。 3、如何解决“粘包”问题 通常为了解决如何从接收缓冲区中区分不同TCP数据包的问题我们会采用 包头包体 的方式 。 正如上图所演示在每个数据包前添加一个固定长度的包头并在包头中记录数据包的总长度。包体部分则承载实际要传输的数据。 处理接收缓冲区数据的步骤如下 Step 1 首先从接收缓冲区读取固定大小的包头例如20字节。 Step 2 解析包头从中获取数据包的总长度这里假设包头中包含的数据长度字段名为Header.Length。 Step 3 根据Header.Length的值确定接下来需要从接收缓冲区读取的数据量。 例如如果包头之后的数据总长度为1048字节减去已读取的20字节包头还需读取1028字节的数据。 通过这种方式即使数据在接收缓冲区中是连续存放的服务器也能够根据每个数据包的包头信息正确地拆分和识别出独立的数据包。 二、recv()函数详解 recv() 函数是专用于
scoket 上的
read 操作用于接收 TCP 套接字数据的系统调用。它在服务器端或客户端程序中用来从连接的对端读取数据本质上是从接收缓冲区读取数据 该系统调用将返回实际读取的字节数其值可能会小于传入的
length 参数。 以下是 recv() 函数的详细说明 1、函数原型 ssize_t recv(int sockfd, void *buf, size_t len, int flags);2、参数 sockfd套接字描述符表示要从中读取数据的 TCP 套接字。 buf指向一个缓冲区的指针用于存储接收到的数据。 len缓冲区的大小即 buf 可以存储的最大字节数。 flags用来修改recv()行为的选项。常用的值包括 0正常接收数据。 MSG_PEEK窥视接收的数据不从接收缓冲区中移除数据。 MSG_WAITALL等待直到接收到 len 个字节的数据或者出现错误。 3、返回值 成功时返回接收到的字节数该值通常小于或等于 len。 失败时返回 -1并设置全局变量 errno 以指示错误类型。 4、错误处理 EAGAIN 或 EWOULDBLOCK在非阻塞模式下如果操作会阻塞则返回此错误。ECONNRESET远程主机强行关闭了一个现有的连接。ENOTCONN套接字未连接即未调用 connect() 或 accept()。ENOTSOCKsockfd 不是一个套接字。 5、使用场景 主要用于 TCP 套接字上的数据接收。对于 UDP 套接字通常使用 recvfrom() 函数。 6、阻塞和非阻塞行为 默认情况下recv() 是阻塞的它会等待直到至少接收到一个字节的数据。对于非阻塞套接字如果接收缓冲区中没有数据recv() 会立即返回返回值为 0。 7、与 read() 的区别 read() 是一个通用的系统调用用于读取文件描述符而 recv() 专门用于套接字。 recv() 可以处理套接字选项和状态而 read() 不能。 8、示例代码 接下来我们通过一个简单的客户端示例演示如何使用recv()接收数据: #include iostream #include sys/socket.h #include arpa/inet.h #include unistd.h #include cstringint main() {int sockfd socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr inet_addr(127.0.0.1);servaddr.sin_port htons(8000);connect(sockfd, (struct sockaddr*)servaddr, sizeof(servaddr));char buffer[1024];ssize_t nbytes recv(sockfd, buffer, sizeof(buffer), 0);buffer[nbytes] \0;std::cout Received: buffer std::endl;close(sockfd);return 0; }在这个例子中客户端连接到本机的8000端口然后使用recv()接收数据并输出到控制台。你可以自行运行并在服务器端发送数据以验证recv()的效果。 9、注意事项 接收到的数据可能小于请求的长度因此应用程序应该总是检查返回值。recv() 可以与 select() 或 poll() 结合使用以实现更复杂的非阻塞操作。 recv() 函数是 TCP 网络编程中接收数据的基本工具。正确使用它需要考虑套接字的状态、缓冲区的大小以及可能的错误情况。 三、send()函数解析 send() 函数专用于
scoket 上的
write
操作在套接字上发送数据的系统调用。 本质上是向发送缓冲区中写入数据内核在发送
TCP 数据时通常会使用
Nagle
算法把多个小的数据包合并成一个发送给另一端以提高效率。 它是 TCP 网络编程中发送数据的基本工具之一。 以下是 send() 函数的详细解析 1、函数原型 ssize_t send(int sockfd, const void *buf, size_t len, int flags);2、参数 sockfd套接字描述符表示要从中发送数据的套接字。buf指向要发送数据缓冲区的指针。len要发送数据的长度单位为字节。flags用来修改发送行为的选项。常用的值包括 0正常发送数据。MSG_DONTWAIT使 send() 调用非阻塞。MSG_MORE暗示更多的数据要发送可以用于优化传输效率。 3、返回值 成功时返回已发送的字节数该值通常小于或等于 len。失败时返回 -1并设置全局变量 errno 以指示错误类型。 4、错误处理 EAGAIN 或 EWOULDBLOCK在非阻塞模式下如果操作会阻塞则返回此错误。 ECONNRESET远程主机强行关闭了连接。 ENOTCONN套接字未连接到任何远程主机。 ENOTSOCKsockfd 不是一个套接字。 5、使用场景 主要用于已连接的 TCP 套接字上的数据发送。对于 UDP 套接字通常使用 sendto() 函数。 6、阻塞和非阻塞行为 默认情况下send() 是阻塞的它会等待直到数据被发送。 对于非阻塞套接字如果数据不能立即发送send() 会返回 -1 并设置 errno 为 EAGAIN 或 EWOULDBLOCK。 7、与 write() 的区别 write() 是一个通用的系统调用用于写文件描述符而 send() 专门用于套接字。 send() 可以处理套接字选项和状态而 write() 不能。 8、示例代码 const char* message Hello, World!; ssize_t nbytes send(sockfd, message, strlen(message), 0); if (nbytes 0) {perror(send failed);exit(EXIT_FAILURE); }9、注意事项 发送的数据可能因为网络或其他原因没有立即发送出去send() 只是将数据交给了内核。对于非阻塞套接字可以使用 select() 或 poll() 来等待套接字变得可写。 send() 函数是 TCP 网络编程中发送数据的基础。正确使用它需要考虑套接字的状态、数据的长度以及可能的错误情况。此外send() 与 recv() 配合使用可以实现完整的数据发送和接收流程。 需要注意的是recv()和send()都可能出现中断或部分接收/发送的情况因此在实际应用中需要循环调用确保所有数据都被完整传输。此外它们还有一些特殊的flags可以控制阻塞行为等具体用法视实际情况而定。 四、权威之作待续 恭喜你已经完整学习了TCP 流式协议什么是粘包粘包如何处理以及recv()和send()函数这标志着你正在向Socket编程高手的行列迈进。当然Socket编程远不止如此还有select()、poll()等I/O复用函数、Unix域Socket编程、原始套接字编程等更高阶的技巧等待你去发掘。我们期待在不久的将来为你呈现一部Socket编程的不朽权威之作。敬请期待!
http://www.dnsts.com.cn/news/6114.html

相关文章:

  • 大鹏网络网站建设网站h1
  • 蛋糕网站模版深圳外贸公司网站建设公司排名
  • 邵阳汽车网站建设网站外链带nofollow是什么意思
  • 微信公众号可以做网站嘛学生做微商怎么加入
  • 三网合一网站建设报价cdn wordpress 回复
  • 嘉定南翔网站建设网页代码编辑器有哪些软件
  • 网站上线后做什么网站怎么申请微信支付接口
  • dede网站架设教程如何做酒网站
  • 网站做目录网站建设 网站开发
  • 网站自响应深圳有哪些网站公司
  • 亳州企业网站建设佛山外贸网站建设信息
  • 广州做网站(信科网络)天津网站建设的公司
  • 网站中的文字滑动怎么做怎能建设个人网站
  • 企业年金怎么查询海口百度seo
  • php mysql视频网站开发网站建设职业发展前景和现状
  • 网站在网站网站在哪里找到的上海大企业公司排名
  • 娄底网站设计网站建设 证书
  • 安康网站定制厂家国家电网电子商务平台
  • 周口规划建设局网站网站推送怎么做
  • 域名网站空间汉中网站建设公司电话
  • 网站开发合同管辖权异议建设科技网络网站的意义和目的
  • 网站建设仟金手指六六14嘉兴seo外包服务商
  • 域名出售网站主流大型网站开发语言调查
  • 做服务网站要多少钱山东大学网站设计与建设
  • 哈尔滨网站制作案例企业网站怎样做可以搜索到
  • 网站开发程序流程图如何识别网站的建站程序
  • 乐山网站建设公司wordpress收费下载资源插件
  • seo的网站建设标准下载网站
  • 云服务器放网站快么做的好点的外贸网站
  • 网站建设网页开发网站源码下载网站