网络编程day5

作业
1>    使用select完成TCP客户端程序

//client
#include<myhead.h>
#define CLINET_IP "192.168.125.79"
#define CLINET_PORT 9999
#define SERVE_IP "192.168.125.79"
#define SERVE_PORT 8888
int main(int argc, const char *argv[])
{//socket()int cfd=-1;if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);int reuse=1;if(setsockopt(cfd, SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}//(bind())struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLINET_PORT);cin.sin_addr.s_addr=inet_addr(CLINET_IP);if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("[%s:%d]->绑定成功\n",CLINET_IP,CLINET_PORT);//connect()struct sockaddr_in 	sin;sin.sin_family=AF_INET;sin.sin_port=htons(SERVE_PORT);sin.sin_addr.s_addr=inet_addr(SERVE_IP);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("[%s:%d]->连接成功\n",SERVE_IP,SERVE_PORT);//recv()/send()char buf[128]="";fd_set readfds;//定义文件描述符集合FD_ZERO(&readfds);//清空集合FD_SET(0,&readfds);//放入集合FD_SET(cfd,&readfds);//放入集合int res1=-1;//接收select返回int res2=-1;//接收recv返回fd_set tempfds;//定义一个临时文件描述符集合while(1)	{tempfds=readfds;res1=select(cfd+1,&tempfds,NULL,NULL,NULL);if(res1==-1){perror("select error");return -1;}else if(res1==0){printf("time out\n");return -1;}if(FD_ISSET(0,&tempfds)){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;send(cfd,buf,sizeof(buf),0);}if(FD_ISSET(cfd,&tempfds)){bzero(buf,sizeof(buf));res2=recv(cfd,buf,sizeof(buf),0);if(res2==0||strcmp(buf,"quit")==0){printf("服务器下线\n");break;}printf("[%s:%d]->%s\n",SERVE_IP,SERVE_PORT,buf);}}//close()close(cfd);return 0;
}
//serve
#include<myhead.h>
#define PORT 8888
#define IP "192.168.125.79"
int main(int argc, const char *argv[])
{int sfd=-1;if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success _%d_%s_%s\n",__LINE__,__FILE__,__func__);if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success _%d_%s_%s\n",__LINE__,__FILE__,__func__);struct sockaddr_in cin;socklen_t socklen=sizeof(cin);fd_set readfds;	//定义阻塞的文件描述符集合FD_ZERO(&readfds);	//清空FD_SET(sfd,&readfds);	//将文件描述符放入FD_SET(0,&readfds);int res=0;//select返回值int maxfd=sfd;int newfd=-1;char buf[128]="";char rbuf[128]="";//服务器客户端通信struct sockaddr_in arr_cin[1024];fd_set tempfds;while(1){tempfds=readfds;res=select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res==-1){perror("select error");return -1;}else if(res ==0){printf("time out\n");return -1;}else{	for(int index=0;index<=maxfd;index++){if(!FD_ISSET(index,&tempfds))//所有文件描述符没有事件发生	{continue;}else if( index==sfd ){if((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1){perror("accept error");return -1;}arr_cin[newfd]=cin;printf("[%s:%d]:连接成功,newfd=%d\n",inet_ntoa(arr_cin[index].sin_addr),ntohs(arr_cin[index].sin_port),newfd);FD_SET(newfd,&readfds);//新的newfd应当加入原本的readfdsif(newfd>maxfd){maxfd=newfd;}}else if( index==0 ){scanf("%s",buf);printf("将发送所有连接的用户->%s\n",buf);for(int j=4;j<=maxfd;j++){send(j,buf,sizeof(buf),0);}}else{bzero(rbuf,sizeof(rbuf));if(recv(index,rbuf,sizeof(rbuf),0)==0){printf("客户端下线\n");close(index);//关闭套接字文件FD_CLR(index,&tempfds);//移除select数组for(int i=maxfd;i>0;i--){if(FD_ISSET(i,&readfds)){maxfd=i;break;}}continue;}printf("[%s:%d]:%s\n",inet_ntoa(arr_cin[index].sin_addr),ntohs(arr_cin[index].sin_port),rbuf);strcat(rbuf,"^_^");send(index,rbuf,sizeof(rbuf),0);}}}}close(sfd);return 0;
}


2>    使用poll完成TCP并发服务器

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix“专家坐诊”第218期问答汇总

问题一 Q&#xff1a;使用SNMP可以获取到实际数量&#xff0c;知道总数&#xff0c;可以计算出百分比吗&#xff1f;需要怎么操作&#xff1f; A&#xff1a;用可计算监控项。 JIzTjRMC65422586368f3.png 问题二 Q&#xff1a;我这边监控项每1分钟获取一下值&#xff0c;然后…

类和对象(中篇)

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a; 用户没有显式实现&#xff0c;编译器会…

网易面试:亿级用户,如何做微服务底层架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 微服务改造&#xff0c;你是怎么做的&#xff1…

网络世界的黑暗角落:常见漏洞攻防大揭秘

网络世界的黑暗角落&#xff1a;常见漏洞攻防大揭秘 今天带来了网站常见的漏洞总结,大家在自己的服务器上也需要好好进行防护,密码不要过于简单.不然非常容易遭到攻击,最终达到不可挽回的损失.很多黑客想网络乞丐一样将你服务器打宕机,然后要求你进行付费.不知道大家有没有遇到…

【PIE-Engine 数据资源】全球2.5分分辨率累积降水量数据集

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球2.5分分辨率累积降水量数据集时间范围1961年- 2018年空间范围全球数据来源worldclim代码片段var images pie.lmageCollection(WORLDCLIME/GLOBAL_PREC_MONTH") 二、描述 全球2.5分分率果…

【Python炫酷系列】祝考研的友友们金榜题名吖(完整代码)

文章目录 环境需求完整代码详细分析系列文章环境需求 python3.11.4及以上版本PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.…

计算机硬件 4.1声卡与音响

第四章 输入/输出系统 第一节 声卡与音响 一、认识声卡 1.定义&#xff1a;采用脉冲编码调制技术&#xff0c;实现音频和数字信号相互转换的硬件电路。 2.功能&#xff1a;对音频输入设备进行数模或模数转换&#xff0c;将数据存入计算机。 3.组成&#xff1a;数字信号处理芯…

10、Qt:对数据进行加密、解密

一、说明 在Qt项目中简单的对数据进行加密解密&#xff0c;有如下两种方式 1、QCryptographicHash Qt提供了用于加密的类QCryptographicHash&#xff0c;但是QCryptographicHash类只有加密功能&#xff0c;没有解密功能 2、Qt-AES 使用第三方AES库&#xff0c;对数据进行加密解…

【动态规划】08路径问题_下降路径最小和_C++(medium)

题目链接&#xff1a;leetcode下降路径最小和 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求通过 matrix 的下降路径 的 最小和 由题可得&#xff1a; 在下一行选择的元…

用户管理第2节课-idea 2023.2 后端--删除表,从零开始

一、鱼皮清空model文件夹下 二、鱼皮清空mapper文件夹下 三、删除 test 测试类下的部分代码 3.1删除SampleTest 3.2删除部分代码 UserCenterApplicationTests

Android ViewModel的简单应用

Android ViewModel 是一种设计模式&#xff0c;用于在应用程序组件之间存储和管理UI相关的数据。下面是使用Android ViewModel的基本步骤&#xff1a; 添加 ViewModel 依赖&#xff1a;在项目的 build.gradle 文件中添加以下依赖&#xff1a; implementation "androidx.…

【SQL】根据年份,查询每个月的数据量

根据年份&#xff0c;查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…

计算型服务器和通用型服务器的区别_Maizyun

计算型服务器和通用型服务器的区别 随着云计算技术的不断发展&#xff0c;服务器作为云计算的核心基础设施&#xff0c;其类型和功能也在不断丰富。其中&#xff0c;计算型服务器和通用型服务器是两种常见的服务器类型。本文将详细介绍这两种服务器之间的区别。 一、计算型服…

B : DS二叉排序树之创建和插入

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现插入功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…

【Jenkins】Pipeline 简单使用

什么是Jenkins pipeline Jenkins Pipeline是Jenkins的一个插件&#xff0c;它允许你以代码的方式定义和管理持续集成和交付流水线。通过Jenkins Pipeline&#xff0c;你可以将整个软件交付过程定义为一个可重复、可扩展和可管理的流水线。这个流水线可以包括构建、测试、部署和…

DRF从入门到精通二(Request源码分析、DRF之序列化组件)

文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结&#xff1a; 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验 …

mangokit:golang web项目管理工具,使用proto定义http路由和错误

文章目录 前言1、mangokit介绍1.1 根据proto文件生成http路由1.2 根据proto文件生成响应码1.3 使用wire来管理依赖注入 2、mangokit实现2.1 protobuf插件开发2.2 mangokit工具 3、使用示例3.1 创建新项目3.2 添加新的proto文件3.3 代码生成 前言 在使用gin框架开发web应用时&a…

51单片机基于时间片轮转的简单rtos

早就想写写这个了&#xff0c;正好赶上有点时间&#xff0c;写了一下基于51单片机的时间片轮转调度系统&#xff0c;简单的rtos&#xff0c;呵呵。直接上代码。 //基于51单片机时间片轮转的简单rtos。 #include"reg52.h" sbit led1 P2^7; sbit led2 P2^0; sbit key…

Linux学习(1)——初识Linux

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…