网络编程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.hqwc.cn/news/288697.html

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

相关文章

JVM垃圾收集器三色标记算法

垃圾收集算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;这种算法没有什么新的思想&#xff0c;只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比…

作业--day34

使用select完成TCP并发服务器和客户端 server.c #include <myhead.h>#define PORT 8888 #define IP "192.168.125.137"int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror("socket error");re…

融了超24亿元舍不得花,放银行吃利息,这家存储创企厉害了

引言&#xff1a;AI与大模型风起云涌&#xff0c;为什么催生了这匹存储“黑马”&#xff1f; 【阿明观察 &#xff5c; 科技热点关注】 这家总部设在美国的存储初创公司&#xff0c;真的赶上AI与大模型时代的风口了。Vast Data公司最新再次获得E轮融资1.18亿美元&#xff0c;…

开放API签名认证的设计并开发对应的SDK

1. 为什么需要签名认证呢&#xff1f; 假设我们开放了一个接口&#xff0c;而我们的服务器只允许处理1000个请求&#xff0c;如果这个时候由用户疯狂发送几万个请求&#xff0c;可能会导致服务器宕机&#xff0c;影响其他用户的正常使用。这个情况下我们需要对接口进行限流&am…

那些令人惊叹的awk简略写法

​​​​​​​awk是一门美妙的语言&#xff0c;被称为unix命令行工具皇冠上的明珠。它有很多简略写法&#xff0c;用好了可以用极少的代码快速解决问题。 下面就列举一些令人惊叹的awk简略写法&#xff1a; awk {sub(/pattern/, "foobar")} 1 # 无论替换是否成功&…

在scrapy 使用selenium模拟登录获取cookie

前言 最近有一点点爬虫需求&#xff0c;想总结一下scrapy框架的一些基本使用方法&#xff0c;加深印象&#xff0c;自己一直习惯使用一些脚本文件运行爬虫&#xff0c;面对数据量非常大&#xff0c;稳定性要求比较高的&#xff0c;效率需求比较高的情况下还是用scrapy较为合适…

Seata:打造行业首个分布式事务产品

作者&#xff1a;季敏&#xff0c;阿里云分布式事务产品负责人、Seata 开源项目创始人 微服务架构下数据一致性的挑战 微服务开发的痛点 在 2019 年&#xff0c;我们基于 Dubbo Ecosystem Meetup&#xff0c;收集了 2000 多份关于“在微服务架构&#xff0c;哪些核心问题是开…

【C++】开源:ImGui图形用户界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍ImGui图形用户界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

13 v-show指令

概述 v-show用于实现组件的显示和隐藏&#xff0c;和v-if单独使用的时候有点类似。不同的是&#xff0c;v-if会直接移除dom元素&#xff0c;而v-show只是让dom元素隐藏&#xff0c;而不会移除。 在实际开发中&#xff0c;v-show也经常被用到&#xff0c;需要重点掌握。 基本…

TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)

文章目录 泛型1 泛型2 声明合并 命名空间 模块1 模块2 声明文件简介 泛型1 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 首先&#xff0c;我们来实现一个函数…

nuxt学习笔记

主要看的课程1 课程1 课程2 上手简化版 初始化 1.创建项目 使用官方推荐的npx来安装&#xff1a; (npm的5.2.x版本后默认安装了npx) 首先&#xff0c;确保您已经安装了 yarn、npx&#xff08;默认包含在 npm v5.2 中&#xff09;或 npm (v6.1)。 使用 npx 进行搭建项目&…