网络编程技术-----6、I/O复用实现并发服务器

网络编程技术-----6、I/O复用实现并发服务器


一、实验要求

服务器:
????服务器等待接收客户的连接请求,一旦连接成功则显示客户地址,接着接收客户端的名称并显示;然后接收来自该客户的字符串,对接收的字符串按分组进行加密(分组长度为个人学号,密钥为个人序号,分组不够补0),再将加密后的字符发回客户端;之后继续等待接收该客户的信息,直到客户关闭连接,服务器将每个连接的用户所发来的所有数据存储起来,当连接终止后,服务器将显示客户的名字及相应的所有数据。要求服务器具有同时处理多个客户请求的能力。
客户端:
????客户首先与相应的服务器建立连接;接着接收用户输入的客户端名称,并将其发送给服务器;然后继续接收用户输入的字符,再将字符串发送给服务器,同时接收服务器发回的加密后的字符串并显示。之后,继续等待用户输入字符串,指导用户输入的是quit,则关闭连接并退出。


二、实验环境

  • OS:kali
  • 计算机语言:C
  • 编译器:gcc
  • IDE:VsCode

三、I/O复用涉及到的函数

  • **FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。**
  • **FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。**
  • **FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。**
  • **FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。**
  • int select(int maxfd,fd_set rdset,fd_set wrset,fd_set exset,struct timeval timeout);用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型。

四、I/O复用实现流程

??1、定义描述符集合,使用FD_ZERO()函数初始化描述符集合,然后将监听套接字描述符加入描述符集合中。
??2、使用一个永真循环进行轮询。
??3、在每次循环过程中,首先调用select函数将需要监听的描述符集合通知内核,然后使用FD_ISSET()函数判断监听套接字是否已经准备好,若已经准备好,调用accept函数获取已连接套接字,并将已连接套接字放进描述符集合中,然后更新已连接套接字个数和下一个循环调用select函数的第一个参数的值。接着使用在一个for循环中(循环参数为已连接套接字个数,相当于对每个已连接套接字都去查询是否已经准备好)FD_ISSET函数接着判断已连接套接字准备好,若准备完毕,则进行收发数据,若数据收发完毕,返回数据大小为0,则关闭已连接套接字,使用FD_CLR清理掉这个描述符在描述符集合中。以上完成后,则进入下一个循环,接着轮询。


五、实验代码

PS:由于MARKDOWN对代码支持太烂了,需要完整代码的请在下方的作者的github链接中下载或查看或者在下方留下你的邮箱私发也行!!!!

代码链接:https://github.com/windy-purple/I-O


六、运行截图

原文地址:https://www.cnblogs.com/aWxvdmVseXc0/p/11782398.html

时间: 2024-11-06 15:49:17

网络编程技术-----6、I/O复用实现并发服务器的相关文章

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

网络编程技术

                                                     网络编程技术 Java 网络编程 网络基础知识 网络编程的目的:直接或间接地通过网络协议与其他计算机进行通讯. 网络编程中有两个主要的问题: 1.如何准确地定位网络上一台或多台主机. 2.找到主机后如何可靠高效地进行数据传输. 目前较为流行的网络编程模型是客户端/服务器(C/S)结构. 即通信双方一方作为服务器等待客户提出请求并予以相应.客户则在需要服务时向服务器提出申请. 服务器始终运行,

[JAVA_开课吧资源]第五周 I/O操作、多线程、网络编程技术

主题一 I/O操作 » 流的概念 在面向对象语言中, 数据的输入和输出都是通过数据流来实现的.数据流是一组有顺序.有起点和终点的字符集合.就好比是两个不同的池子,一个池子中存满了水,而另一个池子中则没有任何的东西,在这两个水池中安放一个管子,水就可以从一个池子流向另一个池子了.在从一个池子向另一个池子输送水的过程中,水扮演的角色就是数据流. [请点击查看更多内容 转自文章] » Stream stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有

第62节:探索Java中的网络编程技术

前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层->第二层数据链路层->第三层网络层->第四层传输层->第五层会话层->第六层表示层->第七层应用层. 物理层是主要定义物理设备标准,数据链路层是主要讲从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装.这层的数据较帧. 网络层是将从下层接收到的数据进行IP地址的

Java高级特性 第8节 网络编程技术

一.网络概述 1.网络的概念和分类 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程.下面先对网络编程的一些基础知识进行介绍,最后给出使用Java语言进行网络编程的实例. 按照地理覆盖范围,计算机网络可以分为局域网(LAN).城域网(MAN).广域网(WAN). 2

Java网络编程技术

服务器端网络编程步骤 服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是: 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可.这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址. 获得连接:当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换.一般在服务器端编程中,当获得连接时,需

Java网络编程技术1

1. Java网络编程常用API 1.1 InetAddress类使用示例 1.1.1根据域名查找IP地址 获取用户通过命令行方式指定的域名,然后通过InetAddress对象来获取该域名对应的IP地址.当然,程序运行时,需要计算机正常连接到Internet上. 例1. 根据域名查找IP地址 package Net; import java.net.InetAddress; import java.net.UnknownHostException; public class GetIP { pu

Java网络编程技术2

3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知道自己来自何处,以及打算去哪里.所以本身必须包含IP地址.端口号和数据内容. 3.1 示例程序——用UDP实现的聊天程序 用UDP协议通信不需要使用服务器,所以用于聊天的程序只要写一个,分别在不同的机器上运行就可以了,而无须写成服务端和客户端两种形式. 例9. 用UDP实现的聊天程序示例. pack

python 网络编程:socket和select实现伪并发

上节地址:Python网络编程:socket 先补充点内容: 一.send和sendall区别 send,sendall ret = send('safagsgdsegsdgew') #send 发送完成后会有一个返回值,告知发送了多少,并不一定会把数据全部发送过去. sendall:内部调用send,将数据全部发送完为止. 因此我们使用时最好使用sendall 二.粘包 粘包问题需要理解recv()的使用,我们定义接收值的时候会写recv(1024)表示一次接收1024字节,但是有时候接收的数