网络编程6——多线程并发服务器实现(线程分离

2023-10-30

recall一下
在这里插入图片描述

代码实现

(还是要先封装wrap.h)
1,socket
2,bind,绑定端口,注意参数,定义初始化强转化
3,listen函数,限定同时访问数
4,loop中,accept等待连接,注意参数,第三个参数长度的类型是socklen_t

#include<stdio.h>
#include<string.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<ctype.h>
#include<unistd.h>
#include<fcntl.h>
#include "wrap.h"

#define MAXLINE 8192
#define SERV_PORT 8000

struct s_info//定义一个结构体,将地址结构跟cfd捆绑
{
	struct sockaddr_in cliaddr;
	int cfd;
}

void *do_work(void *arg)//回调函数  传入的参数是结构体  
{//回调函数中做大小写转换
	int n, i;
	struct s_info *ts = (struct s_info*)arg;//接收参数,要注意参数类型
	char buf[MAXLINE];//读写需要的缓冲区
	char str[INET_ADDRSTRLEN];
	while(1)
	{
		n = Read(ts->cfd,buf,MAXLINE);//从客户端读入
		if(n == 0)//读完了
		{
			printf("the client %d closed... "ts->cfd);
			break;
		}
		printf("receive from %s at port %d...\n",inet_ntop(AF_INET, &(*ts).cliaddr.sin_addr,str,sizeof(str)),ntohs((*ts).cliaddr.sin_port));//可以读出客户端的套接字
		//转换大小写
		for(i = 0; i<n; i++)
		{
			buf[i] = toupper(buf[i]);
			Write(STDOUT_FILENO,buf,n);//写到屏幕
			Write(ts->cfd, buf, n);
		}
	}
		Close(ts->cfd);
		return (void*)0;	
}

int main(void)
{
	int lfd,cfd;
	struct sockaddr_in servaddr,cliaddr;
	socklen_t cliaddr_len;
	struct s_info ts[256];//创建结构体数组
	int i;
	bzero(&servaddr, sizeof(servaddr));//地址结构清零
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//指定本地任意IP
	servaddr.sin_port = htons(SERV_PORT);//指定端口号
	lfd = Socket(AF_INET, SOCK_STREAM,0);//①创建一个socket,得到lfd
	Bind(lfd, (struct sockaddr *)&servaddr, sizeof(servaddr));//②
	Listen(lfd,128);//③
	//④accept等连接
	while(1)
	{
		cliaddr_len = sizeof(cliaddr);//这个类型要注意!
		cfd = Accept(lfd, (struct sockaddr*)&cliaddr, &cliaddr_len);//阻塞监听客户端链接请求
		//结构体数组的意义/意思?
		ts[i].cliaddr = cliaddr;
		ts[i].cfd = cfd;
		//接收之后开始创建子线程?
		pthread_create(&tid,NULL,do_work, (void*)&ts[i]);//tid是创建的线程的地址,do_work是回调函数,将ts结构体作为参数传给回调函数
		pthread_detach(tid);//子线程分离,防止僵尸线程产生⭐
		i++;	
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程6——多线程并发服务器实现(线程分离 的相关文章

  • 经典面试题 之 哨兵(Sentinel)模式

    1 什么是哨兵模式 反客为主的自动版 能够自动监控master是否发生故障 如果故障了会根据投票数从slave中挑选一个作为master 其他的slave会自动转向同步新的master 实现故障自动转义 2 原理 sentinel会按照指定
  • 刺激战场怎么战斗服务器响应超时,绝地求生刺激战场网络延迟高怎么办 网络延迟解决方法...

    类型 动作射击大小 669 2M语言 中文 评分 4 0 标签 立即下载 绝地求生刺激战场这款射击游戏很受玩家的喜欢 玩家在游戏中可以随时开局吃鸡 不过这款游戏的网络要求会比较高 不然很然后被杀死 那绝地求生刺激战场网络延迟高怎么办 西西小
  • 【美赛】2023年MCM问题Y:理解二手帆船价格(代码&思路)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 数据与术语表 2 1 数据 2 2 术语表 3 超级软件分享与资源下载 3 1 软件分享 3 2 资源
  • 归并排序 mergeSort

    归并排序 mergeSort 基本概念 归并排序的实现 时间复杂度 和 空间复杂度 稳定性 基本概念 将一个数组不断的二分 直到不能分为止 然后将不断对比合并 归并排序适用于链表 不需要额外的储存空间 但是对于数组 需要额外的储存空间 归并
  • push本地代码到gitlab出错

    push本地代码到gitlab出错 刚创建的gitlab版本库 在push代码时出错 git push u origin master To git github com Demo git rejected master gt master
  • getaddrinfo函数解析

    IPv4中使用gethostbyname 函数完成主机名到地址解析 这个函数仅仅支持IPv4 且不允许调用者指定所需地址类型的任何信息 返回的结构只包含了用于存储IPv4地址的空间 IPv6中引入了getaddrinfo 的新API 它是协

随机推荐

  • mysql jdbc 连接串_Mysql JDBC 连接串参数说明

    MySQL的 JDBC URL 格式 for Connector J 如下例 jdbc mysql host port host port database 参数名1 参数值1 参数名2 参数值2 现只列举几个重要的参数 如下表所示 参数说
  • python函数装饰器

    文章目录 一 简单了解装饰器 二 装饰器练习 三 多个装饰器 四 装饰器拓展 1 基础版 无参数的装饰器 2 升级版 有参数的装饰器 一 简单了解装饰器 装饰器 Decorators 是 Python 的一个重要部分 简单地说 他们是修改其
  • Lua基础之coroutine(协程)

    概括 1 创建协程2 coroutine的函数3 coroutine的基本流程4 yield对coroutine流程的干预5 resume function 以及yield之间的参数传递和返回值传递 原文地址 http blog csdn
  • 一文看懂Python系列之装饰器(decorator)(工作面试必读)

    Python的装饰器 decorator 可以说是Python的一个神器 它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能 Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识 小编我当初学习Py
  • 单纯性法解有约束的线性规划问题

    程序功能 1 单纯性法解有约束的线性规划问题 2 标准形式的约束问题 目标函数求最小值 约束化为等式 引入松弛变量 变量全为非负 3 目标函数Z行系数全为非正数 则停止计算 RHS列对应系数为目标值x 化为标准形式之后 形参的意义 4 A是
  • 如何冻结模型,避免 model.train() 改变模型部分模块

    如何永久冻结参数 for name param in self llm model named parameters param requires grad False 虽然以上代码可以冻结模型参数 但无法保证冻结整个模型 model tr
  • gdb 调试子进程

    调试指令如下 gdb fork set follow fork mode child set detach on fork off b fork cpp 13 r 打断点可以打到fork的位置 这样就可以进入到子进程调试 follow fo
  • kali linux调整分区,kali linux 手动分区,不要再盲目的选自动  格式化自己的电脑...

    1 制作一个kali linux启动盘 2 将启动盘插入电脑选择 Grapical install 图形界面安装 附 Install 顾名思义那就是安装了 这是纯字符化界面的安装 Graphical install 这个是图形化界面的安装方
  • IDEA2020-Tomcat热部署两种方法(修改class后不用重启tomcat)

    第一种 第一种也是最常见的 修改为Update classes and resources 不过我的有Update classes and resources这个选项 设置之后 依旧没用 大家可以先康康这个 1 如图 选择Edit Conf
  • 遗传算法简介

    遗传算法简介1 美国Michigan大学的Holland教授及其学生收到生物模拟技术的启发 创造出了一种基于生物遗传和进化机制的适合与复杂系统优化的自适应概率优化技术 遗传算法 1967年 Holland的学生Bagley在其博士论文中首次
  • ESP32-CAM接收串口消息在串口输出

    static String comdata 串口接受数据 while Serial available gt 0 串口收到字符数大于零 comdata char Serial read if comdata 如果接受到数据 Serial p
  • linux调用海康.so

    1 下载SDK 2 把 so包放到一个目录 然后 pro包含 3 把头文件放进去 然后包含 4 上面做的qtcreato可以调用编辑了 如果在源目录下运行需要把库放到 usr lib 5 如果用gnome seiion开机启动还要把hc的文
  • 拉链表...

    目录 什么是拉链表 拉链表的作用 拉链表的形成 什么是拉链表 一张表存储的每一条信息就是一条记录的一个生命周期 这样的表格即为拉链表 拉链表的作用 用于记录一些 会发生变化但是变换频率不高的数据 比如某人的某个手机号使用情概况 通过对于日期
  • java IO学习笔记

    Java 流在处理上分为字符流和字节流 字符流处理的单元为 2 个字节的 Unicode 字符 分别操作字符 字符数组或字符串 而字节流处理单元为 1 个字节 操作字节和字节数组 Java 内用 Unicode 编码存储字符 字符流处理类负
  • 任务五-模型参数优化

    模型参数优化 使用网格搜索法对模型进行调优 调参时采用五折交叉验证的方式 并进行模型评估 网格搜索 网格搜索 其实可以叫穷举搜索 就是在所有候选的参数中 将不同参数组合起来 找出表现最好的一组参数 eg 以有两个参数的模型为例 参数a有3种
  • 导入别人的android studio项目

    在导入别人的android studio项目 假设为项目A 时 会遇到gradle不一致的情况 以下简短介绍解决方法 1 打开要导入的项目的目录 删除下图红框中的文件 2 找到自己以前在自己的android studio的任一项目 假设为项
  • 使用MATLAB快速搭建神经网络实现分类任务(模式识别)(附源码)

    使用神经网络能执行几种典型的任务 聚类 拟合 分类 模式识别 以及时间序列预测 其中分类任务可以说是最常应用的场景之一 在之前的文章里也使用了分类任务作为案例对神经网络进行了入门讲解 时常遇到想要使用神经网络快速地实现分类的同学 今天就讲一
  • Javascript中的shift() 、unshift() 和 pop()、push()区别

    定义一组数据 对其进行添加删除操作 unshift 从头部插入数据 向数组的开头添加一个或更多元素 并返回新的长度 shift 从头部删除数据 把数组的第一个元素从其中删除 并返回第一个元素的值 push 从尾部插入数据 向数组的末尾添加一
  • echarts饼图相关配置及效果展示

    const valData xAxis series data name item typeName value item ylFee feeRatio item feeRatio circleRatio item circleRatio
  • 网络编程6——多线程并发服务器实现(线程分离

    recall一下 代码实现 还是要先封装wrap h 1 socket 2 bind 绑定端口 注意参数 定义初始化强转化 3 listen函数 限定同时访问数 4 loop中 accept等待连接 注意参数 第三个参数长度的类型是sock