23062网络编程day5

news2024/11/20 3:33:38

根据select TCP服务器流程图编写服务器

#include <myhead.h>
#define ERR_MSG(msg) do{\
	fprintf(stderr,"__%d__:",__LINE__);\
	perror(msg);\
}while(0)

#define PORT 8888
#define IP "192.168.114.104"

int keyboard_events(void);
int cliConnect_events(int,struct sockaddr_in*,fd_set*,int*);
int cliRcvSnd_events(int,struct sockaddr_in*,fd_set*,int*);

int main(int argc, const char *argv[])
{
	//创建流式套接字
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd<0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("socket create success\n");
	//允许端口快速地被复用
	int reuse=1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}
	printf("允许端口快速地被复用成功\n");
	//填充地址信息结构体用于bind绑定
	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))<0)
	{
		ERR_MSG("bind");
		return -1;
	}
	printf("bind success\n");
	//设置套接字为被动监听状态
	if(listen(sfd,128)<0)
	{
		ERR_MSG("listen");
		return -1;
	}
	printf("listen success\n");
	//创建一个读集合
	fd_set readfds,tempfds;
	//清空集合
	FD_ZERO(&readfds);
	//将文件描述符添加到集合中
	FD_SET(0,&readfds);
	FD_SET(sfd,&readfds);

	int maxfd=sfd;
	int s_res=-1;
	ssize_t res=-1;
	char buf[128]="";
	struct sockaddr_in saveCin[1024];

	while(1)
	{
		tempfds=readfds;
		s_res = select(maxfd+1,&tempfds,NULL,NULL,NULL);
		if(s_res<0)
		{
			ERR_MSG("select");
			return -1;
		}
		else if(0==s_res)
		{
			printf("timeout\n");
			break;
		}
		printf("__%d__\n",__LINE__);

		for(int i=0;i<=maxfd;i++)
		{
			if(FD_ISSET(i,&tempfds)==0)
			continue;

			//触发键盘输入事件
			if(0==i)
			{
				printf("触发键盘输入事件\n");
				keyboard_events();
			}
			//客户端连接事件
			else if(sfd==i)
			{
				printf("触发客户端连接事件\n");
				cliConnect_events(sfd,saveCin,&readfds,&maxfd);
			}
			else
			{
				printf("触发客户端交互事件\n");
				cliRcvSnd_events(i,saveCin,&readfds,&maxfd);
			}
		}

	}

	if(close(sfd)<0)
	{
		ERR_MSG("close");
		return -1;
	}
	return 0;
}

int keyboard_events(void)
{
	char buf[128]="";
	bzero(buf,sizeof(buf));
	fgets(buf,sizeof(buf),stdin);
	buf[strlen(buf)-1]=0;

	printf(":%s\n",buf);
	return 0;
}

int cliConnect_events(int sfd,struct sockaddr_in saveCin[],fd_set *preadfds,int* pmaxfd)
{
	int newfd=-1;
	struct sockaddr_in cin;
	socklen_t addrlen=sizeof(cin);

	newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
	if(newfd<0)
	{
		ERR_MSG("newfd");
		return -1;
	}
	printf("[%s:%d]客户端连接成功 newfd=%d\n",\
			inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
	saveCin[newfd] = cin;

	FD_SET(newfd,preadfds);
	*pmaxfd = *pmaxfd>newfd ? *pmaxfd:newfd;
	return 0;
}


int cliRcvSnd_events(int fd,struct sockaddr_in* saveCin,fd_set* preadfds,int* pmaxfd)
{
	char buf[128]="";
	bzero(buf,sizeof(buf));

	ssize_t res=recv(fd,buf,sizeof(buf),0);
	if(res<0)
	{
		ERR_MSG("recv");
		return -1;
	}
	else if(0==res)
	{
		printf("[%s:%d]客户端下线 newfd=%d\n",\
			inet_ntoa(saveCin[fd].sin_addr),ntohs(saveCin[fd].sin_port),fd);
		close(fd);
		FD_CLR(fd,preadfds);

		while(FD_ISSET(*pmaxfd,preadfds)==0&&(*pmaxfd)-- >= 0)
		return 0;
	}
		printf("[%s:%d] newfd=%d  :  %s\n",\
			inet_ntoa(saveCin[fd].sin_addr),ntohs(saveCin[fd].sin_port),fd,buf);

		strcat(buf,"*_*");
		if(send(fd,buf,sizeof(buf),0)<0)
		{
			ERR_MSG("send");
			return -1;
		}
		printf("send success\n");
		return 0;
}

思维导图

 

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

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

相关文章

美国纽约10日游

一、前言 我有两周断更了&#xff0c;原因是去纽约只顾着玩&#xff0c;没时间写&#xff0c;今天有时间正好和大家分享一下去纽约的攻略 二、以下是一个10天去美国纽约旅游的攻略&#xff0c;十万以内&#xff0c;包括机票、酒店、交通、餐饮和景点门票等费用&#xff1a; 第…

Leetcode ->206 反转链表

题目 算法思路及代码实现 #include <iostream> using namespace std;struct ListNode {int val; //当前节点的值ListNode *next;

目标检测笔记(十二):如何通过界面化操作YOLOv5完成数据集的自动标注

文章目录 一、意义二、修改源码获取三、自动标注前期准备四、开始自动标注五、可视化标注效果六、XML转换TXT 一、意义 通过界面化操作YOLOv5完成数据集的自动标注的意义在于简化数据标注的流程&#xff0c;提高标注的效率和准确性。 传统的数据集标注通常需要手动绘制边界框…

通信笔记:RSRP、RSRQ、RSNNR

0 基础概念&#xff1a;RE、RS和RB RE (Resource Element)&#xff1a;资源元素是 LTE 和 5G 网络中的最小物理资源单位。一个资源元素对应于一个子载波的一个符号周期。 RS (Reference Signal)&#xff1a;参考信号是在 LTE 和 5G 网络中用于多种目的的特定类型的信号。它们可…

PyCharm切换虚拟环境

PyCharm切换虚拟环境 为了满足不同任务需要不同版本的包&#xff0c;可以在Anaconda或者Miniconda创建多个虚拟环境文件夹&#xff0c;并在PyCharm下切换虚拟环境。 解决方案 1、打开Ananconda Prompt 2、创建自己的虚拟环境 格式&#xff1a;conda create -n 虚拟环境名字…

SSH远程连接macOS服务器:通过cpolar内网穿透技术实现远程访问的设置方法

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

《华为认证》二层EVPN的配置

步骤1&#xff1a;配置PE和P设备的IGP以及mpls、mpls ldp&#xff08;略&#xff09; 步骤2&#xff1a;配置evpn实例&#xff0c;并且绑定到BD中&#xff0c;配置evpn的源ip地址 PE1: evpn vpn-instance 1 bd-mode //指定创建BD模式EVPN实例 route-distinguisher 100:1 vpn-…

【Leetcode】130.被围绕的区域

一、题目 1、题目描述 给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域里所有的 O 用 X 填充。 示例1: 输入:board = [[“X”,“X”,“X”,“X”],[“X”,“O”,“O”,“X”],[“X”,“X”,“O”,“X”],[“X”,“O”,“X”,“…

操作符算数转换题

目录 1.交换两个变量&#xff08;不创建临时变量&#xff09; 2.统计二进制中1的个数 3.打印整数二进制的奇数位和偶数位 4.求两个数二进制中不同位的个数 5.【一维数组】有序序列合并 6.获得月份天数 7.变种水仙花数 8.选择题总结tips 这篇博文主要分享操作符&算…

[蓝桥复盘] 算法赛内测赛2 20230831

[蓝桥复盘] 算法赛内测赛2 20230831 总结新一与基德的身高大战1. 题目描述2. 思路分析3. 代码实现 肖恩的投球游戏加强版1. 题目描述2. 思路分析3. 代码实现 体育健将1. 题目描述2. 思路分析3. 代码实现 小桥的奇异旋律1. 题目描述2. 思路分析3. 代码实现 区间or划分1. 题目描…

刷新你对Redis持久化的认知

认识持久化 redis是一个内存数据库&#xff0c;数据存储到内存中。而内存的数据是不持久的&#xff0c;要想做到持久化&#xff0c;就需要让redis把数据存储到硬盘上。因此redis既要在内存上存储一份数据&#xff0c;还要在硬盘上存储一份数据。这样这两份数据在理论上是完全相…

掌握Spring框架核心组件:深入探讨IOC、AOP、MVC及注解方式面试指南【经验分享】

目录 引言 一、Spring IOC篇 1.什么是Spring 2.核心概念 3.核心架构 4.什么是控制反转&#xff08;IOC&#xff09; 5.依赖注入&#xff08;DI&#xff09; 二、Spring AOP篇 1.什么是AOP 2.Spring AOP代理机制 3.核心概念 4.通知分类 三、Spring MVC篇 1.什么…

【24考研】:四川大学计算机学院23届874考研考情分析

四川大学计算机学院23届CS考研考情分析 作者&#xff1a;老李 往年都是大佬们做的&#xff0c; 今年正好自己在做公众号这一块&#xff0c; 因此不自量力的承担这个工作&#xff0c;顺便锻炼一点pandas包和plt包的应用能力。 所以形式上我也会仿照一下往年的大佬。 21考情&a…

【Nacos】使用Nacos-Sync同步两个Nacos集群中的数据

Nacos-Sync官方文档&#xff1a;NacosSync 用户手册 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范,支持多种数据源存储,默认使用Hibernate实现,更加方便的支持表的自动创建更新使用了高效的事…

pg_database中的datlastsysoid

一&#xff0c;关于 pg_database 在 PostgreSQL 中&#xff0c;对于在数据库集群内创建的每个数据库,其关键信息都会被保存到 pg_database 系统表中。 PostgreSQL 确保通过 pg_database 系统表持久化存储每个数据库的属性信息&#xff0c;以方便后续管理和使用。这也让 pg_da…

【广州华锐互动】综合管廊3D可视化管理系统有效解决城市公用设施管理问题

在过去的几十年中&#xff0c;城市化进程不断加速&#xff0c;城市规模不断扩大&#xff0c;人口密度不断增加。这种发展带来了对城市基础设施的巨大需求&#xff0c;尤其是对电力、水、燃气和通信等公用设施的管理和维护。 为了满足这些需求&#xff0c;许多城市开始建设和管理…

如何实现自定义数据库账号密码加解密

背景 在实际的项目开发中我们有时候基于安全考虑需要在项目配置文件中对数据库账号密码做加密处理&#xff0c;这个时候我们就可以使用jasypt这个组件来实现。如果有些项目安全等级要求比较高&#xff0c;可能加密的算法需要自定义或者使用SM4国密算法来实现加解密&#xff0c…

【人工智能】—_逻辑回归分类、对数几率、决策边界、似然估计、梯度下降

文章目录 逻辑回归分类Logistic Regression ClassificationLogistic Regression: Log OddsLogistic Regression: Decision BoundaryLikelihood under the Logistic ModelTraining the Logistic ModelGradient Descent 逻辑回归分类 考虑二分类问题&#xff0c;其中每个样本由一…

【webpack】HMR热更新原理

本文&#xff1a;参考文章 一、HMR是什么&#xff0c;为什么出现 1、出现的原因 之前&#xff0c;应用的加载、更新都是一个页面级别的操作&#xff0c;即使单个代码文件更新&#xff0c;整个页面都要刷新&#xff0c;才能拿到最新的代码同步到浏览器&#xff0c;导致会丢失…