网络编程——IO模型

2023-11-12

搭建select的TCP客户端

#include <stdio.h>
#include <head.h>
#include <string.h>
#include <stdlib.h>

#define PORT 6666
#define IP "192.168.112.40"


int main(int argc, const char *argv[])
{
	//创建流式套接字
	int cfd = socket(AF_INET, SOCK_STREAM, 0);
	if(cfd < 0)
	{
		Err("socket");
		return -1;
	}

	printf("cfd = %d\n",cfd);

	//绑定客户端的IP和端口————>非必须绑定
	//若不绑定,则操作系统会给客户端绑定上客户端所在的主机IP,以及随机端口(49151~65535)


	//填充地址消息结构体,真实的地址信息结构体根据地址族制定
	//AF_INET:man 7 ip
	//要连接哪个服务器,就填对应的服务器的IP和端口
	struct sockaddr_in sin;
	sin.sin_family 		= AF_INET;     	 //必须填AF_INET
	sin.sin_port  		= htons(PORT);   //端口号:1024~49151
	sin.sin_addr.s_addr = inet_addr(IP); //本机IP ifconfig查看

	//连接服务器
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	{
		Err("connect");
		return -1;
	}
	printf("connect ok\n");


	//创建一个读集合
	fd_set readfds, tempfds;

	FD_ZERO(&readfds);
	FD_ZERO(&tempfds);

	FD_SET(0, &readfds);
	FD_SET(cfd, &readfds);

	int maxfd = cfd;

	char buf[128] = "";
	ssize_t res = 0;

	int s_res = -1;
	int newfd = -1;

	while(1)
	{
		tempfds = readfds;

		//调用IO多路复用函数 select()
		s_res = select(maxfd + 1, &tempfds, NULL, NULL, NULL);
		if(s_res < 0)
		{
			Err("select");
			return -1;
		}
		else if(0 == s_res)
		{
			printf("time out...\n");
			break;
		}

		if(FD_ISSET(0, &tempfds))
		{
			printf("触发键盘输入事件\n");
			bzero(buf,sizeof(buf));
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1]=0;

			//发送数据
			res = send(cfd, buf, sizeof(buf), 0);
			if(res < 0)
			{
				Err("send");
				return -1;
			}
		}

		if(FD_ISSET(cfd, &tempfds))
		{
			printf("触发服务器交互事件\n");
			bzero(buf,sizeof(buf));
			//接收数据
			res = recv(cfd, buf, sizeof(buf), 0);
			if(res < 0)
			{
				Err("recv");
				return -1;
			}
			else if(0 == res)
			{
				printf("[%s :%d]cfd = %d 服务器掉线\n", IP, PORT, cfd);
				break;
			}

			printf("[%s :%d]cfd = %d : %s\n", IP, PORT, cfd, buf);
		}
	}

	close(cfd);

	return 0;
}

 

上传的代码

网络编程_凌归的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程——IO模型 的相关文章

随机推荐

  • vue : 无法加载文件 C:\Users\jianfei\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。...

    背景 在新电脑上配置vue环境 PS E CODE PROJ myvue vue23 P61 使用脚手架 vue test gt npm install g vue cli npm WARN deprecated source map ur
  • python——class类和方法的用法详解

    因为一直不太清楚面向对象的类和方法的编程思想 所以特地补了一下python class的知识 在这里记录和分享一下 文章目录 类和方法的概念和实例 1 python类 class 2 类的构造方法 init 3 类中方法的参数 self 4
  • Redis持久化机制

    目录 Redis的持久化 RDB Redis会在以下几种情况下对数据进行快照 AOF append only file AOF的实现 AOF的重写原理 Redis的持久化 Redis支持两种方式的持久化 一种是RDB方式 另一种是AOF a
  • 一个完整的性能测试流程

    下午逛一个测试交流群时 聊起性能测试 然后某位群成员说他们用的loadrunner做性能 当时觉得这话有点偏颇 虽然我也是一个性能测试道路上的摸索前进者 诚然 我们在进行性能测试工作的过程中 需要借助工具的辅助来帮我们完成一些工作 但loa
  • 计算机存储容量单位读法及换算B、KB、MB、GB、TB、PB、EB、ZB、YB、RB、QB

    1KB 1024B 1MB 1024KB 1024 1024B 1B byte 字节 8 bit 位 比特 1KB Kilobyte 千字节 1024 B 2 10 B 1MB Megabyte 兆字节 百万字节 简称 兆 1024 KB
  • 2023国赛数学建模B题思路代码 - 多波束测线问题

    1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术 声波在均匀介质中作匀 速直线传播 在不同界面上产生反射 利用这一原理 从测量船换能器垂直向海底发射声波信 号 并记录从声波发射到信号接收的传播时间
  • C++ 中栈对象的使用总结、RAII

    背景 栈区用于存放函数的参数 局部变量 返回值等 栈区的数据由编译器自动进行分配 在作用域内有效 在超出变量作用域后 栈中数据由编译器自动释放 栈内存分配运算内置于处理器的指令集 效率高 但是分配的内存容量有限 栈对象 栈对象在创建时会自动
  • yagmail发送附件

    效果图 经测试代码 导入yagmail第三方库 import yagmail yagmail SMTP user 邮箱名 host SMTP服务器域名 yag yagmail SMTP user 284036658 qq com host
  • 程序员的自我修养——链接,装载与库(一)

    程序员的自我修养 链接 装载与库这本书看了差不多有一个多月了 这本书讲了很多计算机底层的知识 也补充了我的知识盲区 但是感觉看完以后前面有的知识有遗忘 因此就想好好的总结一下 也可以更好的理解这本书 计算机三个最重要的硬件是 中央处理器CP
  • Linux用户与用户组

    Linux目录详解 目录名 说明 bin 重要的二进制 binary 应用程序 包含二进制文件 系统的所有用户使用的命令都在这个目录下 boot 启动 boot 配置文件 包含引导加载程序相关的文件 开机时用到的引导文件 data 数据存储
  • 事件驱动框架(五)——框架的实现

    事件驱动框架 五 框架的实现 说明 这里先描述一下QP的一些策略和源码 因为某原因这个系列先停更 后面主要是内核介绍 实现 1 临界区 临界区内每次只准许一个线程 进程 进入 进入后不允许其他线程 进程 进入 因此临界区的代码不可分割 在嵌
  • 【axios】get/post请求params/data传参总结

    axios中get post请求方式 1 前言 最近突然发现post请求可以使用params方式传值 然后想总结一下其中的用法 2 1 分类 get请求中没有data传值方式 经过查阅资料 get请求是可以通过body传输数据的 但是许多工
  • jeecgboot接口限制每ip每分钟访问次数——限制ip请求频率【伸手党福利】

    代码借鉴的别人的 自己做过部分修改 1 新建文件夹并新建文件 jeecg boot base jeecg boot base core src main java org jeecg common accesslimit RequestLi
  • Spire.XLS 图表系列教程:C# 填充 Excel 图表中的图例背景色

    默认情况下 创建图表时 Excel会自动设置其坐标轴属性 这些属性包括坐标轴选项 例如边界最大值 边界最小值 主要单位 次要单位 刻度线标记的主要类型 次要类型 标签位置 横坐标轴交叉设置 是否逆序刻度值等 但是有时我们需要手动设置这些属性
  • nginx之配置文件niginx.conf(全网看这一篇就行)

    指定nginx的工作进程的用户及用户组 默认是nobody用户 user nobody 指定工作进程的个数 默认是1个 具体可以根据服务器cpu数量进行设置 比如cpu有4个 可以设置为4 如果不知道cpu的数量 可以设置为auto ngi
  • 【lwIP(第十三章)】WebServer协议

    目录 一 WebServer简介 二 Web服务器工作原理 三 CGI技术简介 四 CGI工作原理 五 SSI技术简介 六 SSI工作原理 一 WebServer简介 Web Server 就是提供 Web 服务的 Server 主要功能是
  • 【GRE】GRE普通考试改革前后区别

    参考张禄老师的视频 首先是官网的总结 从图中看出的几个点 写作 由 argument issue 改为 issue 删除 argument 这意味着写作想获得高分将更加困难 因为大陆考生基本都是靠 argument 拉分的 数学和语文 题量
  • 谈谈我的个人追求

    说到个人追求 我发现我自己都无法说出来 是我没有答案 还是不敢去追求呢 是我的心太浮 要的太多吧 反正这个问题也不是几分钟的思考就可以得到的答案 这个问题 或许需要我一辈子的努力去寻找 见识的东西太少了 视野过于狭隘 愿努力之 看到更大的世
  • 三、MySql 数据类型

    文章标题 Mysql数据类型 Int 类型 INT N 是什么 字符类型 排序规则 时间类型 前文 mysql权限 Mysql数据类型 Int 类型 有无符号 在项目中使用 BIGINT 而且是有符号的 演示 create table te
  • 网络编程——IO模型

    搭建select的TCP客户端 include