【网络编程】基于TCP的服务器端/客户端

TCP是Transmission Control Protocol(传输控制协议)简写。因为TCP套接字是面向连接的,因此又称为基于流的套接字。

把协议分为多个层次,设计更容易,通过标准化操作设计开放式系统

网络层介绍

链路层

链路层是物理连接领域标准化的结果,是最基本的领域,专门定义LAN,WAN,MAN等网络标准。

IP层

选择传输数据的路径。IP是面向消息的、不可靠的协议。每次传输数据会帮选择一条路径,但并不一致,若发送路径错误则选择其他路径;若发送数据丢失或错误则无法解决。IP协议无法应对数据错误。

TCP/UDP层

TCP和UDP层以IP层提供的路径信息为基础完成实际的数据传输,故该层又称为传输层。

IP层只关注一个数据包的传输过程。传输顺序以及传输本身不可靠,添加TCP可以在交换数据过程确认对方已经收到数据,并重传丢失数据,这类通信是可靠的。

应用层

数据传输路径、数据确认过程都被隐藏到套接字内部,只需利用套接字编出程序即可。编写软件过程中,需要根据程序特点决定服务器端和客户端之间的数据传输规定,这边是应用层协议。

实现基于TCP的服务器端/客户端

调用socket函数创建套接字,声明并初始化地址信息信息结构体变量,调用bind函数向套接字分配地址如上章所示。

通过调用listen函数进入等待连接请求状态,只有调用listen函数客户端才能进入可发出连接请求的状态,即调用connect函数。

#include<sys/socket.h>
int listen(int sock,int backlog);
//成功返回0,失败返回-1

参数:sock希望进入等待连接请求状态的套接字文件描述符,传递的描述符套接字成为服务器套接字(监听套接字)。backlog连接请求等待队列。

服务器端处于等待连接请求状态是指,客户端请求连接时,受理前一直使请求处于等待状态。

客户端如果向服务器端询问:“请问我是否可以发起连接?”服务器端套接字就会亲切应答:“您好!当然可以,但系统正忙,请到等候室排号等待,准备好后会立即受理您的连接。”同时将连接请求请到等候室。调用listen函数即可生成这种门卫(服务器端套接字),listen函数的第二个参数决定了等候室的大小。等候室称为连接请求等待队列,准备好服务器端套接字和连接请求等待队列后,这种可接收连接请求的状态称为等待连接请求状态。

受理客户端连接请求

#include<sys/socket.h>
int accept(int sock,struct sockaddr * addr, socklen_t * addrlen);

sock:服务器套接字的文件描述符。
addr:保存发起连接请求的客户端地址信息的变量地址值,调用函数后向传递来的地址变量参数填
充客户端地址信息。
addrlen:第二个参数addr结构体的长度,但是存有长度的变量地址。函数调用完成后,该变量即被填入客户端地址长度。

TCP客户端得默认函数调用顺序

#include<sys/socket.h>
int connect(int sock,struct sockaddr * servaddr,socklen_t addrlen);

sock---------客户端套接字文件描述符。
servaddr----保存目标服务器端地址信息的变量地址值。
eaddrlen-----以字节为单位传递已传递给第二个结构体参数servaddr的地址变量长度。

函数返回情况:1.服务器端接收连接请求    2.发生断网等异常情况而中断连接请求

注意:接受连接并不意味着服务器端调用acccpet函数,是服务器将连接请求记录到等待队列。

客户端套接字地址信息

实现服务端必给套接字分配IP地址和端口号,但客户端实现过程未出现,而是创建套接字后立即调用connect函数。网络数据交换必须分配IP和端口号,怎么?

客户端分配地址:

  • 何时:调用connect函数时
  • 何地:操作系统,内核
  • 如何:IP用计算机(主机)的IP,端口随机。

基于TCP的服务器端/客户端函数调用关系

流程:服务器端创建套接字后连续调用bind、listen函数进入等待状态,客户端通过调用connect函数发起连接请求。注意:服务器端调用listen函数才能调用connect函数。且客户端调用connect函数前,服务器端有可能率先调用accept函数。此时服务器在调用accept函数时进入阻塞状态,知道客户端调用connect函数为止。

实现迭代服务器端/客户端

服务器端将客户端传输的字符串数据原封不动地传回客户端。

实现迭代的服务器端

服务器端在同一时刻只与一个客户端相连,并提供回声服务。

服务器端依次向5个客户端提供服务并退出。

客户端接收用户输人的字符串并发送到服务器端。

服务器端将接收的字符串数据传回客户端,即“回声”服务器端与客户端之间的字符串回声一直执行到客户端输人Q为止。

存在问题:“每次调用read、write函数时都会以字符串为单位执行实际的/O操作。”
当然,每次调用write函数都会传递1个字符串,因此这种假设在某种程度上也算合理。“TCP不存在数据边界“。上述客户端是基于TCP的,因此,多次调用write函数传递的字符串有可能一次性传递到服务器端。此时客户端有可能从服务器端收到多个字符串,这不是我们希望看到的结果。还需考虑服务器端的如下情况:字符串太长,需要分2个数据包发送!在此过程中,客户端有可能在尚未收到全部数据包就调用read函数。

回声客户端传输的是字符串,且是通过调用write函数一次性发送的。之后还调用一次read函数,期待接收自己传输的字符串。问题所在。

解决方法,可以提前确定接收数据的大小。若之前传输了20字节长的字符串,则在接收时循环调用read函数读取20个字节。

若问题不在回声客服端:定义应用层协议

回声客户端可以提前知道接收的数据长度,但我们应该意识到,更多情况下这不太可能。既然如此,若无法预知接收数据长度时应如何收发数据?此时需要的就是应用层协议的定义。之前的回声服务器端/客户端中定义了如下协议。
        “收到Q就立即终止连接。”

同样,收发数据过程中也需定好规则以表示数据的边界,或提前告知收发数据的大小。服务器端/客户端实现过程中逐步定义的这些规则集合就是应用层协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/703613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐系统三十六式学习笔记:原理篇.近邻推荐09|协同过滤中的相似度计算方法有哪些?

目录 相似度的本质相似度的计算方法&#xff1a;1、欧式距离2、余弦相似度3、皮尔逊相关度4 、杰卡德&#xff08;Jaccard&#xff09;相似度 总结 相似度的本质 推荐系统中&#xff0c;推荐算法分为两个门派&#xff0c;一个是机器学习派&#xff0c;一个是相似度门派。机器学…

网络编程2----UDP简单客户端服务器的实现

首先我们要知道传输层提供的协议主要有两种&#xff0c;TCP协议和UDP协议&#xff0c;先来介绍一下它们的区别&#xff1a; 1、TCP是面向连接的&#xff0c;UDP是无连接的。 连接的本质是双方分别保存了对方的关键信息&#xff0c;而面向连接并不意味着数据一定能正常传输到对…

天熠电脑怎么更换文件夹位置?三种方法,轻松驾驭

在日常使用电脑的过程中&#xff0c;文件夹的管理和整理对于提升工作效率和保持桌面整洁至关重要。然而&#xff0c;随着文件的不断增多和项目的频繁切换&#xff0c;我们可能需要不断调整文件夹的位置以适应新的工作需求。今天&#xff0c;我们就以天熠电脑为例&#xff0c;为…

LeetCode | 20.有效的括号

这道题就是栈这种数据结构的应用&#xff0c;当我们遇到左括号的时候&#xff0c;比如{,(,[&#xff0c;就压栈&#xff0c;当遇到右括号的时候&#xff0c;比如},),]&#xff0c;就把栈顶元素弹出&#xff0c;如果不匹配&#xff0c;则返回False&#xff0c;当遍历完所有元素后…

“圆周素数”算法题解析

什么是圆周素数&#xff1f; 将一个素数逐位轮转后&#xff0c;所得到的数依然是素数&#xff0c;那么就称这个数为圆周素数。 例如&#xff1a;197是一个素数&#xff0c;将它逐位轮转后所得到的数&#xff0c;971&#xff0c;719 依然是素数。 小于100的圆周素数一共有13个…

HLS入门实验

文章目录 一、HLS介绍1.1 什么是HLS1.2HLS与VHDL/Verilog编程技术有什么关系?1.3HLS的关键技术和技术局限性1.3.1关键技术1.3.2 技术局限性 二、HLS入门实验2.1安装Vivado2.2创建项目2.3添加文件2.4仿真2.5创建Vivado工程2.6生成IP核2.7添加代码 参考 一、HLS介绍 1.1 什么是…

MySQL的发展历程:欧洲诞生,中国兴盛,美国低谷

目录 1 早期历史 2 成长与发展 3 重大变化和收购 4 现代发展 5 结语 一直比较写一些数据库相关的技术和操作、优化等文章。但写数据库在中国一般也逃脱不了MySQL这个数据库。下面简单谈一些个人看法。 MySQL整体上是起于欧洲&#xff1a; 一直有开源社区运营&#xff0c…

社会组织上前台、高质量发展勇担当|番禺区社联会成立十周年大会

6月5日&#xff0c;番禺区社联会举行“社会组织上前台&#xff0c;高质量发展勇担当”庆祝成立十周年大会暨“百社联百村—助力百千万工程”专项行动启动仪式。 广东省社会组织总会副秘书长王洁珊&#xff0c;广州市民政局一级调研员李又文&#xff0c;番禺区委副书记、区长叶珊…

网络安全到底是什么?一篇概念详解(附学习资料)

一、什么是网络安全&#xff1f;&#xff08;文末有资料&#xff09; “网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行&#xff0c;网络服务不中断。” 说白了网络安全就…

集合java

1.集合 ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 package com.itheima;import java.util.ArrayList;/*public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 | | p…

DOM-获取元素

获取元素的方法&#xff1a; 方法一&#xff1a;根据id获取元素document.getElementById <div id"time">2024-6-4</div> 在script标签中&#xff1a;注意getElementById括号里面必须要有引号&#xff0c;获得的是对象类型 var timer document.getEle…

harmony相关开发参考文档

以下列举一些Harmony Os应用开发文档以及相关参考开源案例&#xff0c;可协助高效率开发&#xff1a; 1.鸿蒙NEXT开发官方资料&#xff1a;包含鸿蒙NEXT开发所有的特性&#xff0c;HarmonyOS SDK等&#xff0c;可以按需查阅&#xff0c;需要开通白名单&#xff1a;应用开发导读…

2024版CorelDRAW中文破解授权码激活码!立即下载CorelDRAW中文版终身永久破解下载攻略

在设计领域&#xff0c;CorelDRAW一直以其强大的图形编辑和矢量绘图功能而受到专业用户的青睐。随着CorelDRAW 2024的发布&#xff0c;设计师们迎来了更加丰富的工具和更新的功能&#xff0c;使得创意实现更为轻松和精准。对于追求成本效益的用户而言&#xff0c;CorelDRAW 202…

【SpringBoot + Vue 尚庭公寓实战】房间支付方式管理接口实现(三)

【SpringBoot Vue 尚庭公寓实战】房间支付方式管理接口实现&#xff08;三&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】房间支付方式管理接口实现&#xff08;三&#xff09;1、查询全部支付方式列表2、保存或更新支付方式3、根据ID删除支付方式 房间支付方式管理…

express入门03增删改查

目录 1 搭建服务器2 静态文件托管3 引入bootstrap4 引入jquery5 编写后端接口5.1 添加列表查询方法5.2 添加路由5.3 添加数据表格 总结 我们前两篇介绍了如何利用express搭建服务器&#xff0c;如何实现静态资源托管。那利用这两篇的知识点&#xff0c;我们就可以实现一个小功能…

如何手动实现multiSetIfAbsent、multiExpire

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”); 🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三…

Multimodal Dynamics:用于多模态融合背景下的分类

Multimodal Dynamics&#xff08;MD&#xff09;是可信赖的多模态分类算法&#xff0c;该算法动态评估不同样本的特征级和模态级信息量&#xff0c;从而可信赖地对多模态进行融合。 来自&#xff1a;Multimodal Dynamics: Dynamical Fusion for Trustworthy Multimodal Classi…

2、python 基础学习总结

文章目录 一、python 标识符和变量命名规则1、python 标识符2 python 变量和变量命名规则 二、数据类型2.1 Numbers&#xff08;数字类型&#xff09;2.2 String&#xff08;字符串类型&#xff09;2.2.1 单引号、双引号、三引号字符串之间的区别2.2.2 转义字符 在这里插入图片…

PDU模块中浪涌保护模块与空开模块的应用

由于PDU具体应用的特殊性&#xff0c;其在规划设计时具有应用场景的针对性&#xff0c;同时PDU的高度定制化的特点&#xff0c;是其他电气联接与保护产品所不具备的。 PDU基础的输出输入功能外&#xff0c;其电路的控制与电压保护器同时也极为重要。空气开关和浪涌保护器相关功…

自动驾驶场景下TCP协议参数优化调整案例分享

RTT 往返时间&#xff0c;从tcp协议栈决定发包&#xff0c;到收到回包的时间。 包含本地驱动&#xff0c;网卡硬件&#xff0c;网线&#xff0c;交换机&#xff0c;收包方处理的耗时。需注意如果开了delayed ack&#xff0c;协议栈未做特殊处理&#xff08;默认没做&#xff…