2月7日作业

分别通过select、多进程、多线程实现一个并发服务器

#include <myhd.h>
#define IP "192.168.250.100"
#define PORT 8888
int deal_cli_msg(int newfd,struct sockaddr_in cin)
{char buf[128] = "";while(1){bzero(buf,sizeof(buf));int res = recv(newfd,buf,sizeof(buf),0);if(res == 0){printf("客户端已下线\n");break;}else if(res < 0){perror("recv error");return -1;}strcat(buf,"->is read\n");send(newfd,buf,sizeof(buf),0);}close(newfd);return 0;
}
void handler(int signo)
{if(signo == SIGCHLD){while(waitpid(-1,NULL,WNOHANG) > 0);}
}
int main(int argc, const char *argv[])
{int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){perror("socket error");return -1;}printf("socket success,sfd = %d\n",sfd);int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1){perror("setsocket 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");if(listen(sfd,128) == -1){perror("listen error");return -1;}printf("listen success");struct sockaddr_in cin;cin.sin_family = AF_INET;socklen_t socklen = sizeof(cin);pid_t pid;if(signal(SIGCHLD,handler) == SIG_ERR){perror("signal error");return -1;}while(1){int newfd = accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd == -1){perror("accept error");return -1;}printf("accept success");pid = fork();if(pid > 0){close(newfd);}else if(pid == 0){close(sfd);deal_cli_msg(newfd,cin);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}}close(sfd);return 0;
}

#include <myhd.h>
#define PORT 8888
#define IP "192.168.250.100"
struct msg_info
{int newfd;struct sockaddr_in cin;
};
void *deal_cli_msg(void *arg)
{int newfd = ((struct msg_info*)arg) -> newfd;struct sockaddr_in cin = ((struct msg_info*)arg) -> cin;char buf[128] = "";while(1){bzero(buf,sizeof(buf));int res = recv(newfd,buf,sizeof(buf),0);if(res == 0){printf("客户端已下线\n");break;}else if(res < 0){perror("recv error");return NULL;}strcat(buf,"->is read\n");send(newfd,buf,sizeof(buf),0);}close(newfd);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){perror("socket error");return -1;}printf("socket success,sfd = %d\n",sfd);int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("setsockopt success\n");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\n");if(listen(sfd,128) == -1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in cin;cin.sin_family = AF_INET;socklen_t socklen = sizeof(cin);while(1){int newfd = accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd == -1){perror("accept error");return -1;}printf("accept success\n");struct msg_info info = {newfd,cin};pthread_t tid;if(pthread_create(&tid,NULL,deal_cli_msg,&info) != 0){printf("pthread_create error\n");return -1;}if(pthread_detach(tid) != 0){printf("pthread_detach error\n");return -1;}}close(sfd);return 0;
}

#include<myhd.h>#define PORT 8888              //端口号
#define IP "192.168.250.100"       //IP地址//封装处理客户端信息函数
int deal_cli_msg(int newfd, struct sockaddr_in cin)
{//5、收发数据使用newfd完成通信char buf[128] = "";while(1){//清空字符串bzero(buf, sizeof(buf));//read(newfd, buf, sizeof(buf));        //从套接字中读取客户端发来的消息int res = recv(newfd, buf, sizeof(buf), 0);        //从套接字中读取客户端发来的消息//buf[strlen(buf)-1] = '\0';//判断收到的结果if(res == 0){printf("客户端已经下线\n");break;}else if(res < 0){perror("recv error");return -1;}printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);//将读取的信息,加上一些字符发送回去strcat(buf, " -> is read\n");//    write(newfd, buf, sizeof(buf));send(newfd, buf, sizeof(buf), 0); }close(newfd);             //关闭通信的套接字}int main(int argc, const char *argv[])
{//1、创建用于接受连接的套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}printf("socket success sfd = %d\n", sfd);    //4//设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("设置端口快速重用成功 _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);//2、绑定IP地址和端口号//2.1、填充要绑定的地址信息结构体struct sockaddr_in sin;sin.sin_family     = AF_INET;         //表明是ipv4sin.sin_port     = htons(PORT);        //端口号sin.sin_addr.s_addr = inet_addr(IP);     //IP地址//2.2、绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);//3、将套接字设置成被动监听状态if(listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);//4、阻塞等待客户端连接请求,如果有新的客户端连接,则创建一个新的用于通信的套接字//4.1、定义客户端地址信息结构体struct sockaddr_in cin;             //客户端地址信息结构体cin.sin_family     = AF_INET;socklen_t socklen = sizeof(cin);          //客户端地址信息的大小定义一个用于检测文件描述符的集合fd_set readfds, tempfds;                          //在栈区定义清空容器中的内容FD_ZERO(&readfds);将要检测的文件描述符放入集合中FD_SET(sfd, &readfds);           //将sfd文件描述符放入FD_SET(0, &readfds);             //将0号文件描述符放入//定义一个容器char buf[128] = "";int res = 0;             //接收select的返回值while(1){将集合内容复制一份tempfds = readfds;使用select阻塞等待集合中的文件描述符有事件产生res = select(sfd+1, &tempfds, NULL, NULL, NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){printf("time out\n");return -1;}判断sfd是否还在集合中if(FD_ISSET(sfd, &tempfds)){//4.2、阻塞接收客户端的链接请求,并且获取客户端的地址信息int newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);if(newfd == -1){perror("accept error");return -1;}printf("accept success _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);deal_cli_msg(newfd,cin);}if(FD_ISSET(0, &tempfds)){//从终端获取数据fgets(buf, sizeof(buf), stdin);       //从终端获取数据buf[strlen(buf)-1]='\0';printf("触发终端输入事件:%s\n", buf);}}//6、关闭所有套接字close(sfd);               //关闭监听return 0;
}

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

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

相关文章

Java完整版宿舍管理

项目技术&#xff1a; springboot layui idea mysql5.7 jdk1.8 maven3 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; &#xff08;1&#xff09;基本信息管理 基本信息分为学生信息和宿舍信息两部分&#xff0c;其功能是负责维护这些信息&#xff0c…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(二)

gnome-builder创建的程序&#xff0c;在工程树中有三个重要程序&#xff1a;main主程序、application应用程序和window主窗口程序。main整个程序的起始&#xff0c;它会操作application生产应用环境&#xff0c;application会操作window生成主窗口&#xff0c;于是就有了 appli…

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

AOP相关

AOP相关 什么是AOP&#xff1f; 常见的场景 记录操作日志 缓存处理 spring内置事务处理 AOP记录操作日志 定义切点表达式&#xff0c;确定要记录的方法 找到方法中有log注解的方法 获得方法 获得方法的参数 spring中的事务实现 spring中的事务分声明式事务和编程式事务…

巴菲特经典演讲:这些人只关注两个数字,便取得了成就

1984年&#xff0c;为纪念格雷厄姆&#xff08;Benjamin Graham&#xff09;和多德&#xff08;Daved L. Dodd&#xff09;所合著的《证券分析》出版五十周年&#xff0c;巴菲特应哥伦比亚大学邀请&#xff0c;进行了一次题为《格雷厄姆-多德式的超级投资者》&#xff08;The S…

[VulnHub靶机渗透] WestWild 1.1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

#Js篇:js里面递归的理解

定义&#xff1a; 递归是一种编程技术&#xff0c;它是指一个函数在其定义内部调用自身的过程。 特点&#xff1a; 一个问题可以分解为更小的问题用同样的方法解决&#xff1b;分解后的子问题求解方式一样&#xff0c;不同的是数据规模变小&#xff1b;存在递归终止条件 作…

Springboot根据环境读取application配置文件

目录 1. 首先创建两个不同配置文件 2. pom.xml 配置文件 3. 指定环境 4. 最后启动测试 1. 首先创建两个不同配置文件 分别为开发环境和生产环境 application-dev.properties 和 application-prod.properties application-dev.properties 配置为 1931 端口 application-pro…

[leetcode] 31. 下一个排列

文章目录 题目描述解题方法两遍扫描java代码复杂度分析 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下…

可靠性测试

1 软件可靠性测试 软件可靠性概述 可靠性&#xff08;reliability&#xff09;是指产品在规定的条件下和规定的时间内完成规定功能的能力。 固有可靠性是通过设计、制造赋予产品的可靠性&#xff1b;使用可靠性既受设计、制造的影响&#xff0c;又受使用条件的影响。一般使用可…

(43)找出中枢整数

文章目录 每日一言题目解题思路法一&#xff1a;法二&#xff1a; 代码法一&#xff1a;法二&#xff1a; 结语 每日一言 即使慢&#xff0c;驰而不息&#xff0c;纵令落后&#xff0c;纵令失败&#xff0c;但一定可以达到他所向往的目标。——鲁迅 题目 题目链接&#xff1a…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…