
计算机网络
文章平均质量分 62
心若向阳,何谓悲伤
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C/S模型UDP实现
一、处理模型由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,保证通讯可靠性的机制需要在应用层实现。二、实现服务器端:#include <string.h>#include <netinet/in.h>#include <stdio.h>#include <unistd.h>#include <strings.h>#include <arpa/inet.h>#include <ctype原创 2021-08-19 10:49:08 · 254 阅读 · 0 评论 -
UDP服务器
传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。相较于TCP而言,UDP通信的形式更像是发短信。不需要在数据传输之前建立、维护连接。只专心获取数据就好。省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证。因此,我们称UDP为“无连接的不可靠报文传递”。那么与我们熟知的TCP相比,UDP有哪些优点和不足呢?由于无需创建原创 2021-08-19 10:31:29 · 212 阅读 · 0 评论 -
epoll 边沿触发 非阻塞 IO 服务器
在之前的文章中提到过Readn 函数:ssize_t Readn(int fd, void *vptr, size_t n) 试想这样一种情况:1、server 循环使用 epoll_wait,监听 fd,fd 发生读事件,epoll_wait 通知 server。2、server 接到通知,调用 Readn 函数,读取 500 字节。3、但是,client 就发送了 200 字节,不足 500 字节。4、此时,server 会阻塞在 Readn 函数上。5、意味着 server 无法执行下原创 2021-08-15 10:29:29 · 205 阅读 · 0 评论 -
epoll 边沿触发(ET 模式)和水平触发(LT 模式)
(1)应用 ET 模式的目的:改变 epoll_wait 的默认属性,可以减少调用 epoll_wait 函数的调用次数。(2)思想由来:模拟电路的高低电频的思想。水平触发: 持续的 1 持续的 0边沿触发: 0 ->1 ;1 -> 0(3)场景:用 epoll 实现一个服务器,调用 epoll_wait 函数进行监听,此时 client 给 epoll 发送了 100 字节的数据,而 server 使用 read 函数读走 50 字节,剩余 50 字节,问题:epoll_wait原创 2021-08-13 14:31:57 · 953 阅读 · 0 评论 -
epoll 版 高并发服务器
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <arpa/inet.h>#include <sys/epoll.h>#include <errno.h>#include <ctype.h>int main(){ // 1 创建套接字 int lfd = socket(AF原创 2021-08-13 13:55:47 · 170 阅读 · 0 评论 -
多路 IO 转接 :epoll 函数
因为 select 和 poll 的返回值特性,所以想判断到底哪个文件描述符发生了事件,需要遍历文件描述符表,因此,在“高并发、少访问”情况下,比如 1000 个连接,就 3 个发了数据,select 和 poll 效率就很低。理想状态:内核直接告诉我“哪个文件描述符”发生了“什么事件”:此功能对应于epoll 模型。(1)头文件#include <sys/epoll.h>(2)函数1)创建一个 epoll 句柄:int epoll_create(int size)参数: 监听原创 2021-08-12 22:32:00 · 158 阅读 · 0 评论 -
poll 版 高并发服务器
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include <poll.h>#include <ctype.h>#include <errno.h>#define MAXLINE 80原创 2021-08-12 16:51:47 · 206 阅读 · 0 评论 -
多路 IO 转接 :poll 函数
(1)头文件#include <poll.h>(2)函数原型int poll (struct pollfd *fds, nfds_t nfds, int timeout);(3)参数参 1:struct pollfd 类型结构体数组的首地址 。是传入传出参数struct pollfd {int fd; // 要监听的文件描述符:负值无效short events; // 要监听的事件宏: POLLIN (读) / POLLOUT(写) / POLLERRshort reve原创 2021-08-12 16:09:47 · 139 阅读 · 0 评论 -
select 版 高并发服务器
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <ctype.h>#include <string.h>#include <sys/socket.h>#include <sys/select.h>int main(){ // 1 创建套接字 int lfd原创 2021-08-12 15:21:09 · 185 阅读 · 0 评论 -
多路 IO 转接 :select 函数
(1)头文件:#include <sys/select.h>(2)函数原型:int select( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout );(3)参数说明1)参数1:监听的所有文件描述符中,最大文件描述符的编号 + 1(即监听 fd 的总个数)。2)参数2、3、4:监听的文件描述符 “是否可读”、“是否可写”、“是否异常” 的事件;fd_set原创 2021-08-11 21:50:44 · 207 阅读 · 0 评论 -
多线程版 高并发服务器
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <ctype.h>#include <strings.h>#include <pthread.h>typedef struct client_info{ int cfd; struct sockaddr_in client原创 2021-08-11 12:23:37 · 201 阅读 · 0 评论 -
链路层寻址和ARP
一、网络层地址和链路层地址每个节点有网络层地址和链路层地址。网络层地址:节点在网络中分配的一个唯一地址即IP地址,用于把分组送到目的IP网络。长度为32比特。链路层地址:又叫做MAC地址或物理地址、局域网地址。此地址用于把数据帧从一个节点传送到另一个节点中。MAC地址是节点“网卡”本身所带的地址,是唯一的。它的地址长度通常为6字节即48比特。这2字节的地址用16进制表示,每个字节表示为一对16进制数。注意网卡的MAC地址是永久的,它在生产时固化在其ROM里。下图为局域网的MAC地址:局域网中原创 2021-08-10 22:41:54 · 926 阅读 · 0 评论 -
多进程版 高并发服务器
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <ctype.h>#include <strings.h>#include <sys/wait.h>#include <signal.h>void func(int sig) { while( (waitpid(-1原创 2021-08-10 15:29:41 · 155 阅读 · 0 评论 -
TCP 中粘包的产生和解决
当发送方的“发送速度”大于接收方的“处理速度”时,就会出现问题。比如:接收方一直没有处理,发送方第一次发送一个包大小为 100 字节,第二次发送 200 字节,则缓冲区内有数据 300 字节,当接收方从缓存区中取数据时,就无法决定该从何处将 2 个数据包分开,这种问题就是粘包问题。TCP 粘包:发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。为了避免粘包现象,可采取以下几种措施:(1)添加结尾标记:比如 \n ,则需要用到 Readline 函数;原创 2021-08-09 10:57:52 · 135 阅读 · 0 评论 -
半关闭函数:高级版的 close 函数
半关闭函数:close() :只会将某文件的“描述符引用计数”减 1;shutdown ():会关掉连接在同一个套接字上的所有文件描述符,即计数置 0。代码为:#include <sys/socket.h> int shutdown(int sockfd, int how);参数how:(1)SHUT_RD (0):关闭读功能,不允许 sockfd 进行读操作。该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被丢弃掉。(2)SHUT_WR (1):关闭写功能,不允许 .原创 2021-08-09 10:42:31 · 245 阅读 · 0 评论 -
端口复用(解决C/S模型的BUG)
在上篇文章中介绍了TCP 的状态转换,现在看之前C/S通信代码的BUG:(1)如果服务器作为主动方,先调用 close,服务器会进入 FIN_WAIT_2(半关闭状态);(2)客户端调用 close 后,服务器会处于 TIME_WAIT 状态;(3)因为服务器需要等待 2MSL 才能进入 CLOSE,在 2MSL(大约 1min)期间,服务器并没有真正关闭,原端口被占用中,如果此时立即再启动服务器,会发现无法启动解决方法:在 server 代码的 socket()和 bind()调用之间插入如下代码原创 2021-08-09 10:23:41 · 221 阅读 · 0 评论 -
TCP 的状态转换
转换图如下:其中粗实线代表主动方动作;虚线代表被动方动作;细实线代表主动方和被动方同时的动作。1、主动方(1)主动建立连接过程:一般来讲:客户端主动、服务器被动(但不绝对)。主动方原始处于 CLOSE(关闭状态);然后向被动方发送 SYN 请求连接 ,这时 主动方处于 SYN_SENT(主动打开状态),此时等待被动方的 ACK 应答 ,得到应答的同时,被动方也会向主动方发送 SYN请求连接 ,主动方接收到这 2 个消息,同时回复被动方的请求 ,这时主动方处于 ESTABLISHED(数据传输原创 2021-08-09 10:02:58 · 257 阅读 · 0 评论 -
多路访问链路和协议
目前有两种网络链路:(1)点对点链路:链路两端各一个节点。一个发送和一个接收。如点对点协议PPP。(2)广播链路:多个节点连接到一个共享的广播信道。共享广播信道是非常常见的,例如无线WIFI接入式卫星通信接入式,又例如我们在公共场合说话等都属于共享信道,共享信道的特点是当一个人在说话时,其他人需要安静的听,如果有多个人同时说话,会导致收听的人听不清楚,这就是产生了干扰。同理,在共享链路上,一个节点发送数据帧,这个数据帧是在共享链路下广播的。即任何一个节点传输一帧时,信号在信道上广播,其他节点都可以收到一原创 2021-08-06 11:48:00 · 1678 阅读 · 0 评论 -
差错检测和纠错技术
一、差错检测和纠错技术简单介绍本篇讲的差错检测和纠错技术主要是针对比特错误。对一个节点发送到一个相邻节点的帧,检测是否出现比特差错,并纠正。相关技术有很多,下图为差错检测和纠正的过程。在发送节点,数据D附加若干差错检测和纠错位EDC,一起发送到链路。数据D包括网络层传来的数据报,以及链路级寻址信息、序列号和其他字段。保护范围包括数据D的所有字段。接收节点接收比特序列D’和EDC’。接收方利用收到的D’按照规则来计算差错校验位EDC,看计算的EDC是否与收到的EDC’相同,相同则无错误,不相同则有错原创 2021-08-04 14:30:33 · 5391 阅读 · 0 评论 -
链路层概述
一、链路层的术语和职责(1)节点:主机和路由器。(2)链路:沿着通信路径连接相邻节点的通信信道。链路可分为有线链路和无线链路。(3)数据帧:第二层的分组,它是封装了数据报。数据链路层的职责是将数据报从一个节点传送到与该节点直接有物理链路相连的另一个节点。二、链路层的类比数据报可以在不同的链路上传输,每段链路可以采取不同的链路层协议。例如在第一段链路上采用以太网技术,在中间链路采用帧中继技术,在最后一段链路采用802.11无线以太网技术。其次,不同的链路层协议提供的服务也不相同,例如有的链路层协原创 2021-08-04 10:16:17 · 647 阅读 · 0 评论 -
IPv6数据报
由于新的子网和IP结点以惊人的增长率连到因特网上,并被分配唯一的IP地址,32比特的IP地址空间即将用尽。为了应对这种对大IP地址空间的需求,开发了一种新的IP协议,即IPv6。一、IPv6数据报格式IPv6中引入的最重要的变化显示在其数据报格式中:(1)扩大的地址容量:IPv6地址长度从32比特增加到128比特。这就确保全世界将不会用尽IP地址。(2)简化高效的40字节首部:许多IPv4字段已被舍弃或作为选项,因而所形成的40字节定长首部允许更快地处理IP数据报。(3)流标签与优先级:流标签标原创 2021-08-03 23:14:20 · 1362 阅读 · 0 评论 -
距离向量路由算法
一、距离向量路由算法特点距离向量路由算法是一种迭代的、异步的和分布式的算法。(1)分布式:每个节点都从其直接相连邻居接受信息,进行计算,再将计算结果分发给邻居。(2)迭代:计算过程一直持续到邻居之间无更多信息交换为止。(3)异步:不要求所有节点相同之间步伐一致地操作。(4)自我终结:算法能自行停止。最低费用表示:dx_xx(y)=minv_vv{c(x,v)+dv_vv(y)}。dx_xx(y):节点x到节点y地最低费用路径的费用;v:节点x的邻居节点;c(x,v)+dv_vv原创 2021-08-03 18:08:18 · 19835 阅读 · 3 评论 -
检查数据报:防火墙和入侵检测系统
当攻击者知道我们的IP地址范围后,可以很方便地在此范围种发送IP数据报进行寻址。这些数据报能够做各种不正当地事情。例如用ping搜索和端口扫描形成我们的网络图;用恶意分装使易受攻击的主机崩溃;用纷至沓来的ICMP分组洪范服务器,并且通过在分组种带有恶意软件感染主机。对于上述恶意分组攻击的两种流行的防御措施是防火墙和入侵检测系统。1、防火墙我们可以尝试在自己的网络和因特网之间安装一台防火墙。如今大多数接入路由器都具有防火墙能力。防火墙检查数据报和报文段首部字段,拒绝可疑的数据报进入内部网络。例如,一台防原创 2021-08-03 11:30:34 · 326 阅读 · 0 评论 -
互联网控制报文协议(ICMP)
一、ICMP作用ICMP被主机和路由器用来彼此沟通网络层信息。ICMP作用:(1)支持主机或路由器进行差错报告,例如当运行一个Telent、FTP、或HTTP会话时,我们有时会遇到“目的网络不可达”之类的错误报文。这种报文就是在ICMP中产生的。(2)支持主机或路由器进行网络探寻。二、ICMP类型两类ICMP报文:(1)差错报告报文,有5种,目的不可达、源抑制、超时/超期、参数问题、重定向都属于差错报告报文。(2)网络探寻报文,有两组,分别为回声请求与应答报文、时间戳请求与应答报文。上图原创 2021-08-03 10:18:05 · 1208 阅读 · 0 评论 -
通用即插即用(UPnP)
上篇文章中提到的NAT穿越大多由通用即插即用(UPnP)提供,UPnP是一种允许主机发现并配置邻近NAT的协议。使用UPnP要求主机和NAT都是UPnP兼容。使用UPnP,在主机上运行的应用程序能够为某些请求的公共端口号请求一个NAT映射,该映射位于专用IP地址、专用端口号和公共IP地址、公共端口号之间。如果某NAT接受该请求并生成映射,则来自外部的节点能够发起到公共IP地址、公共端口号的TCP连接。UPnP允许外部主机使用TCP或UDP向NAT化的主机发起通信会话。长期以来NAT一直对P2P应用程序十原创 2021-08-03 08:50:05 · 925 阅读 · 0 评论 -
链路状态路由算法
一、路由的基本概念(1)默认路由器:与主机直接相连的路由器,又叫第一路由器。每当主机发送一个分组时,都先传送给它的默认路由器。源主机的默认路由器被成为源路由器;目的主机的默认路由器被称为目的路由器;从源主机到目的主机的选路归结为从源路由器到目的路由器的选择。(2)路由算法:是确定一个分组从源路由器到目的路由器所经路径的算法。路由算法的关键:在给定的一组路由器以及连接路由器的链路中,找到一条从源路由器到目的路由器的”好“路径。怎样才算好路径呢?就是具有”最低费用“的路径。可以是最小的链路延时,经过的原创 2021-08-02 21:19:35 · 5686 阅读 · 1 评论 -
网际协议:动态主机配置协议(DHCP)和NAT
一、DHCP给一台主机配置IP地址这个场景非常熟悉,例如当我们带着一台笔记本来到校园时,笔记本首先需要获得本机的IP地址以及默认路由器的地址等相关信息才能上网。主机地址也可以手动配置,但是这项任务目前通常更多的是使用动态主机配置协议(DHCP)。DHCP允许一个主机自动获取以下信息:IP地址、子网掩码、默认网关、DNS地址。该协议支持即插即用,即一个新的网络设备加入网络时不需要重新启动该协议。...原创 2021-08-02 13:49:04 · 1587 阅读 · 0 评论 -
网际协议:数据报格式和分片以及IPv4编址
一、报文格式和分片因特网网络层协议的内部视图如下:包括路由协议、IP协议和ICMP协议。(1)路由协议的主要功能是路径选择,计算出用于在网络中转发分组的转发表。(2)IP协议用于规定编址规则、数据报格式以及数据处理规则。(3)ICMP协议主要复杂报告数据报中的差错和对某些网络层信息请求进行响应。1、IP数据报格式网络层的分组被称为数据报。(1)版本号:这4比特规定了数据报的IP协议版本。通过查看版本号,路由器能够确定如何解释数据报的剩余部分。不同的IP版本使用不同的数据报格式。上图是IP原创 2021-07-30 13:27:41 · 1423 阅读 · 0 评论 -
路由器的工作原理
一、路由器的两个核心功能(1)运行路由算法/协议(RIP、OSPF、BGP)。(2)将分组从路由器的输入链路传送到正确的输出链路。二、路由器的体系结构如上图所示,整个路由器的体系结构由输入端口、交换结构、输出端口和选路处理器组成。1、输入端口(1)线路端接模块:对应最左边的框,将一条物理链路端接到路由器的物理层即接收比特流得到数据帧。(2)数据链路处理模块:对应于中间的框,实现路由器的数据链路层功能,即将得到的数据帧进行解封装和分析从而得到数据报。(3)查找与转发模块:对应于最右边的框,原创 2021-07-29 17:00:47 · 1465 阅读 · 0 评论 -
虚电路和数据报网络
在前面的文章中我们知道运输层能够为应用程序提供无连接服务或面向连接服务。类似的是,网络层也能够在两台主机之间提供无连接服务或连接服务。但是网络层与运输层还是有差异的,具体为:(1)在网络层中,这些服务是由网络层向运输层提供的主机到主机的服务。在运输层中,这些服务是运输层向应用层提供的进程到进程的服务。(2)网络层或者提供主机到主机的无连接服务,或者提供主机到主机的连接服务,而不同时提供这两种服务。数据报网络提供网络层的无连接服务;虚电路网络提供网络层的连接服务。(3)运输层面向连接服务是位于网络边缘的原创 2021-07-29 11:38:26 · 3644 阅读 · 0 评论 -
网络层概述
网络层提供的功能简单来说有如下:(1)从发送方主机传输报文段到接收方主机。(2)发送方主机封装报文段为数据报。(3)接收方递交报文段给传输层。在每个主机、路由器上都需要运行网络层协议。路由器会检查通过它的所有IP数据报的头部字段,然后根据目的IP地址对数据报进行转发。如上图所示,上图显示了一个具有两台主机和两台主机之间的路径上有几台路由器的简单网络。假设主机A向主机B发送消息,主机A的网络层将从传输层获得的报文段封装成数据报,然后将该数据报向相邻路由器发送。在接受方主机B,网络层接收来自相邻路由原创 2021-07-28 23:16:03 · 346 阅读 · 0 评论 -
TCP拥塞控制
一、TCP拥塞控制原理TCP的一个关键部分就是其拥塞控制机制。TCP必须使用端到端拥塞控制而不是使用网络辅助的拥塞控制,因为IP层不向端系统提供显示的网络拥塞反馈。TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。那么是如何限制的呢?主要通过拥塞窗口(cwnd)。运行在发送方的TCP拥塞控制机制对拥塞窗口进行跟踪,这个拥塞窗口对一个TCP发送方能向网络中发送流量的速率进行了限制。限制公式如下:LastByteSent-LastByteAcked<=min原创 2021-07-28 16:35:03 · 6738 阅读 · 1 评论 -
SYN洪范攻击
因为本人即将去读研,专业是网络空间安全,所以在学习计算机网络时会关注安全性。 这里我将SYN洪范攻击单独写一篇文章。在TCP三次握手时客户端首先会发送一个SYN报文段,服务器端为了响应收到的SYN报文段,会回送一个ACK报文段并分配和初始化连接变量与缓存。这时服务器端会等待来自客户端的ACK响应,如果客户端迟迟不发送ACK报文段,那么最后服务器端将终止该半开连接并将已分配的资源回收。这种TCP连接管理协议为Dos攻击即SYN洪范攻击提供了环境。在这种攻击过程中,攻击者发送大量的TCP SYN报文段,但是原创 2021-07-28 09:16:33 · 625 阅读 · 1 评论 -
TCP流量控制与连接管理
一、TCP流量控制在前面的文章中我们讲过,一条TCP连接每一侧主机都为该连接设置了接收缓存。如果应用程序读取数据时相对较慢,而发送方发送的太快太多,这时就可能会导致该连接的接收缓存溢出。这时TCP要为它的程序提供速度匹配服务和流量控制服务。(1)速度匹配服务:发送速率和接收应用程序的提取速率匹配。(2)流量控制:发送方不能发送的太多太快,让接收缓存区溢出。那么TCP流量控制是如何工作的呢?如上图所示,左边为接收窗口,右边为接收缓存,我们假设TCP接收方丢弃失序的报文段。(1)流量控制使用接收原创 2021-07-27 12:37:25 · 506 阅读 · 0 评论 -
TCP往返时延的估计和超时
如何设置TCP超时值原创 2021-07-22 15:16:17 · 3916 阅读 · 2 评论 -
流水线可靠数据传输协议
在构造可靠传输协议那一篇我们知道rdt3.0的利用率是非常低的,为了解决利用率问题我们用流水线技术取解决。流水线:发送方允许发送多个“在路上的”,还没有确认的报文。在这个过程中序号数目的范围必须增加,在发送方/接收方必须有缓冲报文。流水线技术有两个通用形式:(1)回退N帧法(2)选择重传如下图,流水线主要是为了增加利用率。回退N帧和选择重传主要取决于传输协议如何处理丢失、损坏以及时延过大的分组。一、回退N帧法发送方做的动作是将发送但未被确认的分组设为最大的N。允许N个连续的没有应答的分组进原创 2021-07-22 09:18:04 · 1035 阅读 · 1 评论 -
TCP概述
一、TCP特点TCP特点:(1)点对点:只有一个发送方、一个接收方,连接状态与端系统有关,不为路由器所知。(2)全双工数据的数据传输:是同一连接上的双向数据流,可以传输最大报文段长度,有最大的传输单元。(3)可靠按序的字节流:没有”信息边界“。(4)流量控制机制:发送方要控制它的流量,不会淹没接收方(5)面向连接传输:在数据交换前握手(交换控制信息)初始化发送方和接收方的状态。(6)采用了流水线协议:为TCP拥塞和流量控制设置相应的窗口滑动协议。TCP发送缓存和接收缓存:客户进程通过套接原创 2021-07-19 15:17:26 · 363 阅读 · 0 评论 -
构造可靠数据传输协议
在本篇文章中我们将逐步了解开发发送方和接收方的可靠数据传输协议的过程,它们逐渐复杂,最后会得到一个无错、可靠的数据传输协议。在这个过程中仅考虑单向数据传输但控制信息双向流动。我们用有限状态机(FSM)来标识发送方和接收方。如下图所示:实线箭头指示了协议从一个状态变迁到另一个状态。在对应的一个箭头上,有个类似分数样子的数据。横线上方表示导致状态转换的事件,横线下方是状态转换时执行的动作。接下来本文所有的图都按此理解。一、Rdt1.0:完全可靠信道上的可靠数据传输首先考虑最简单的情况,即在完全可靠的信原创 2021-07-17 23:28:10 · 637 阅读 · 1 评论 -
无连接传输:UDP
一、UDP简单介绍(1)UDP是“无修饰”、“不加渲染的”因特网传输层协议。(2)UDP提供“尽最大努力”服务,即不保证可靠交付,同时也不使用拥塞控制。使得UDP数据段可能丢失或传递失序的报文到应用程序。(3)UDP是面向无连接的协议,即在UDP接收者与发送者之间没有握手、每个UDP数据段的处理独立于其它数据段。(4)UDP只在IP的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。为什么会有UDP呢?主要有以下几点:(1)不需要建立连接,这样就减少了延迟。(2)在发送者和接收原创 2021-07-16 19:04:10 · 2203 阅读 · 6 评论 -
使用TCP的简单C/S程序
过程描述依然如下:(1)客户从其键盘读取一行字符并将数据向服务器发送。(2)服务器接收该数据并将这些字符转换为大写。(3)服务器将修改的数据发送给客户。(4)客户接收修改的数据并在其监视器上将该行显示出来。...原创 2021-07-16 15:16:42 · 309 阅读 · 0 评论