11.22 作业 select实现TCP并发客户端/poll实现TCP并发服务器

news2024/11/16 6:25:32
#include <myhead.h>
#define SERIP "192.168.115.162"
#define SERPORT 8888
#define CLIIP "192.168.115.162"
#define CLIPORT 6666
int main(int argc, const char *argv[])
{
	//创建客户端用于通信的套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd == -1){
		perror("socket error");
		return -1;
	}
	printf("cfd = %d\n",cfd);
	//绑定
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port   = htons(CLIPORT);
	cin.sin_addr.s_addr = inet_addr(CLIIP);
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1){
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//连接服务器
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port   = htons(SERPORT);
	sin.sin_addr.s_addr   = inet_addr(SERIP);
	//连接服务器
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){
		perror("connect error");
		return -1;
	}
	//收发数据
	char buf[128] = "";
	char rbuf[128] = "";

	///定义一个用于检测的文件描述符的集合
	fd_set readfds,tempfds;
	///清空容器中的内容
	FD_ZERO(&readfds);
	///将要检测的文件描述付放入集合中
	FD_SET(cfd,&readfds);  //将cfd文件描述符放入
	FD_SET(0,&readfds);    //将0号文件描述符放入

	int res = 0;   //接收select的返回值
	while(1){
		tempfds = readfds;
		///使用select阻塞等待集合重点文件描述符有事件产生
		res = select(cfd+1,&tempfds,NULL,NULL,NULL);
		if(res == -1){
			perror("select error");
			return -1;
		}else if(res == 0){
			printf("time out\n");
			return -1;
		}

		bzero(buf,sizeof(buf));
		bzero(rbuf,sizeof(rbuf));

		///判断0是否还在集合中
		if(FD_ISSET(0,&tempfds)){
			printf("请输入>>>");
			fgets(buf,sizeof(buf),stdin); //从终端输入中读取数据
			buf[strlen(buf)-1] = '\0';

			//将数据发送给服务器
			send(cfd,buf,sizeof(buf),0);
			//如果输入是quit退出
			if(strcmp(buf,"quit") == 0){   
				break;
			}
		}
		///判断cfd是否还在集合中
		if(FD_ISSET(cfd,&tempfds)){
			//接收服务器发来的消息
			int res = recv(cfd,rbuf,sizeof(rbuf),0);
			if(res == 0){
				printf("客户端已经关闭\n");
				break;
			}
			printf("rbuf = %s\n",rbuf);
		}
	}
	close(cfd);
	return 0;
}

#include<myhead.h>
#define PORT 8888              //端口号
#define IP "192.168.115.162"       //IP地址

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;         //表明是ipv4
    sin.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);          //客户端地址信息的大小

	//定义一个容器
	char buf[128] = "";
	int maxfd = sfd;
	///定义一个集合管理sfd和newfd
	struct pollfd fds[maxfd-2];
	///将sfd文件描述符放入
	fds[0].fd = sfd;
	fds[0].events = POLLIN;  //表明要进行读事件
	
	int rct = 0; //接收poll返回的结果


	while(1){
		rct = poll(fds,maxfd+1,-1);    //第三个参数如果是负数,表明一直等待
		if(rct == -1){
			perror("poll error");
			return -1;
		}else if(rct == 0){
			printf("time out\n");
			return -1;
		}
		if(fds[0].revents == POLLIN){
			//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__);
			fds[newfd].fd = newfd;
			fds[newfd].events = POLLIN;
			if(newfd>maxfd){
				maxfd = newfd;
			}
		}
		for(int i = 1;i<=maxfd;i++){
			if(fds[i].revents == POLLIN){
				//清空字符串
				bzero(buf, sizeof(buf));
				int res = recv(i, buf, sizeof(buf), 0);        //从套接字中读取客户端发来的消息

				//判断收到的结果
				if(res == 0)
				{
					printf("客户端已经下线\n");
					close(i);
					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, "*_*");
				send(i, buf, sizeof(buf), 0);

			}
		}

	}
	close(sfd);
}

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

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

相关文章

数据通信——OSPF路由控制实验

实验需求 我们采用OSPF完成路由的控制&#xff0c;首先连接如下拓扑&#xff1a; 所有设备均属于area 0&#xff0c;网段及环回口配置如上图所示。 实验目的&#xff1a;R4和R1的环回口通信路径为R4——R2——R1若R2出现问题&#xff0c;自动切换到R3路径。 实验配置 1&am…

ChatGPT 改 Bug 能力,惊呆我了!

ChatGTP 是全球公认的最强的 AI 模型&#xff0c;能做的事情太多了。。 对于程序员来说&#xff0c;ChatGPT 可以自动生成代码、代码补全、代码分析、编程语言转换、写 SQL、写程序等等&#xff0c;下面我给大家先简单演示几个。 1、代码生成 ChatGPT 可以根据程序员输入的指…

磁盘配额Quota案例,针对组,用户设置宽限期限,限制值的报表

目的与账号&#xff1a; 1.设计专题&#xff0c;五个人一组&#xff0c;账号分别是myquota1-myquota5,密码&#xff1a;password&#xff0c;初始用户组myquotagrp,其他默认。脚本如下 增加执行权限&#xff0c;运行 2&#xff09;实践quota1&#xff0c;文件系统支持 只针对…

对话特斯拉北美车主:FSD什么水平?深度用户解密V11

作者 |Amy 编辑 |德新 近期中国四部委联合印发通知&#xff0c;部署开展智能网联汽车准入和上路通行试点工作&#xff0c;要求具备量产条件L3、L4 级别智能网联车在限定区域内开展上路试点&#xff0c;并且首次明确事故责任判定。 通知下发后&#xff0c;市场传闻&#xff1a…

STM32_11(SPI)

一、SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08;Master Input Slav…

一个菜单两个二级路由的搭建

效果如下&#xff0c;而且这是最上方的菜单&#xff0c;需要进入以后重定向。 {path: /,name: HOME,component: ConsoleLayout, //这里也有router-viewmeta: {menu: false},redirect: {name: ManagerList},children: [{path: /rightsManage,name: RightsManage,component: () &…

21.Oracle的程序包(Package)

Oracle的程序包Package 一、Package的概述1、什么是Oracle11g的Package2、Package的作用是什么3、常见的系统内置Package 二、创建Package的相关语法1、Package的创建语法2、Package的删除3、具体案例4、Package的使用5、与Package相关的其他语法 三、常见内置程序包的使用1、…

什么是电子负载

电子负载也被称为电子负载器或电源模拟器用于模拟实际负载的设备&#xff0c;它能够吸收和消耗电能&#xff0c;就像真实的电子设备一样&#xff0c;电子负载的主要功能是测试电源、电池、发电机等电源设备的性能和可靠性。 电子负载的工作原理是通过内部的电力转换电路&#x…

西工大网络空间安全学院计算机系统基础实验一(14,15)

给大家强调一点&#xff0c;如果这门课你只是通过了&#xff0c;但是其实你并不懂其中的原理&#xff0c;千万不要害怕&#xff0c;不要胆怯&#xff0c;因为后面你还有很多很多的时间来回头巩固它&#xff0c;正所谓“君子报仇&#xff0c;十年不晚”。同样的道理&#xff0c;…

OSI七层参考模型及其协议和各层设备

OSI网络模型是开放系统互联&#xff08;Open Systems Interconnection&#xff09;参考模型&#xff0c;它是由国际标准化组织&#xff08;ISO&#xff09;制定的。这个模型将网络系统划分为七个层次&#xff0c;OSI网络模型的七层是&#xff1a;物理层、数据链路层、网络层、传…

牛客算法题 HJ99 自守数 golang实现

题目 HJ99 自守数 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 100001≤n≤10000 输入描述&…

ACM32F070 RTC 引脚做普通 GPIO 用法配置

有场景需要把带RTC引脚功能的IO当做普通的GPIO使用&#xff0c;但是按照正常的GPIO初始化却无法使用&#xff0c;该芯片手册中有给出介绍 现给出配置方法&#xff0c;参考官方SDK里面PC13的配置&#xff1a; // PC13 GPIOC_Handle.Pin GPIO_PIN_13; GPIOC_Handle.Mod…

数据可视化:用图表和图形展示数据

写在开头 在当今信息爆炸的时代,海量的数据如同一座沉默的宝库,等待着我们挖掘和理解。然而,这些庞大的数据集本身可能令人望而生畏。在这个时候,数据可视化成为了解数据、发现模式和传达信息的强大工具。本篇博客将带领你探索数据可视化的奇妙世界,学习如何在python中使…

MacBook macOs安装RabbitMQ【超详细图解】

目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ&#xff0c;安装顺便写下安装步骤记录一下以备用 使用brew命令安装&#xff0c;一般Mac会自带这个命令&#xff0c;如没有&#xff0c;…

如何看网络架构图-1基础篇

这是一个比较常见的网络部署架构图&#xff0c;通过LVSKeepalive做网络层的高可用架构&#xff0c;在应用层通过nginx做应用层细粒度的请求管控&#xff0c;然后根据负载均衡策略将请求转发到后端的tomcat服务。 首先看到这样的图&#xff0c;相信大部分人都能看懂&#xff0c;…

【Hydro】SG滤波器纯numpy实现

目录 说明WIKI示例滑动平均卷积系数的推导第一点和最后点的处理scipy.signal中的savgol_filter纯numpy实现的savgol_filterCPP实现的savgol_filter参考文献说明 Savitzky-Golay滤波器(S-G滤波器)是一种在时域和频域上同时进行的滤波方法,它通过局部多项式拟合来平滑信号。这…

python中,or、not的用法

or的用法 在python中,or运算符是一个逻辑运算符&#xff0c;用于在多个条件中选择至少一个为真&#xff08;True&#xff09;的情况。 如果条件中的任意一个为真&#xff0c;整个表达式的结果就为真 如&#xff1a; 示例1: 检查两个数字中至少有一个正数 示例2: x True y …

分发测试应用平台怎么用之应用详情功能

我的应用 应用功能引导 ●您会看到以下页面&#xff0c;下图为功能的解释方便您的运行 我的应用-详情-应用详情 ●我们点击应用详情数字③&#xff0c;点击应用详情&#xff0c;下图是对详情页的功能介绍。 详情-应用设置 ●详情-应用设置-下图为应用设置的上半部分 ●下图为应…

从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;文本数据预处理 从零构建属于自己的GPT系列2&#xff1a;语…

聚焦清晰度评价指标所用到的各种算法

首先&#xff0c;我想吐槽一下&#xff0c;看了好几篇聚焦评价函数的文章&#xff0c;说到底都是一篇文章转载或者重复上传&#xff0c;介绍了将近 15 种清晰度的算法&#xff0c;原文找了半天都没找到在哪&#xff0c;最多也仅能找到一些比较早的转载。 无参考图像的清晰度评…