当前位置: 首页 > news >正文

通过多线程并发方式实现服务器

 与多进程实现对比来看。

示例来源于网络视频

#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 8000struct s_info {                     //定义一个结构体, 将地址结构跟cfd捆绑struct sockaddr_in cliaddr;int connfd;
};void *do_work(void *arg)
{int n,i;struct s_info *ts = (struct s_info*)arg;char buf[MAXLINE];char str[INET_ADDRSTRLEN];      //#define INET_ADDRSTRLEN 16  可用"[+d"查看while (1) {n = Read(ts->connfd, buf, MAXLINE);                     //读客户端if (n == 0) {printf("the client %d closed...\n", ts->connfd);break;                                              //跳出循环,关闭cfd}printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &(*ts).cliaddr.sin_addr, str, sizeof(str)),ntohs((*ts).cliaddr.sin_port));                 //打印客户端信息(IP/PORT)for (i = 0; i < n; i++) buf[i] = toupper(buf[i]);                           //小写-->大写Write(STDOUT_FILENO, buf, n);                           //写出至屏幕Write(ts->connfd, buf, n);                              //回写给客户端}Close(ts->connfd);return (void *)0;
}int main(void)
{struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;int listenfd, connfd;pthread_t tid;struct s_info ts[256];      //根据最大线程数创建结构体数组.int i = 0;listenfd = Socket(AF_INET, SOCK_STREAM, 0);                     //创建一个socket, 得到lfdbzero(&servaddr, sizeof(servaddr));                             //地址结构清零servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);                   //指定本地任意IPservaddr.sin_port = htons(SERV_PORT);                           //指定端口号 8000Bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); //绑定Listen(listenfd, 128);      //设置同一时刻链接服务器上限数printf("Accepting client connect ...\n");while (1) {cliaddr_len = sizeof(cliaddr);connfd = Accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);   //阻塞监听客户端链接请求ts[i].cliaddr = cliaddr;ts[i].connfd = connfd;/* 达到线程最大数时,pthread_create出错处理, 增加服务器稳定性 */pthread_create(&tid, NULL, do_work, (void*)&ts[i]);pthread_detach(tid);                                                    //子线程分离,防止僵线程产生.i++;}return 0;
}

相关文章:

通过多线程并发方式实现服务器

与多进程实现对比来看。 示例来源于网络视频 #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"#de…...

【C语言】指针超级无敌金刚霹雳进阶(但不难,还是基础)

点击这里访问我的博客主页~~ 对指针概念还不太清楚的点击这里访问上一篇指针初阶2.0 上上篇指针初阶1.0 谢谢各位大佬的支持咯 今天我们一起来学习指针进阶内容 指针进阶 一、指针变量1、字符指针变量2、数组指针变量①数组指针变量的定义②数组指针变量的初始化 3、函数指…...

上位机图像处理和嵌入式模块部署(qmacvisual入门)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然我们前面学习了很多的知识点&#xff0c;比如说在windows这边&#xff0c;用qt写界面&#xff0c;用opencv写图像处理代码&#xff1b;在linux…...

数据库事务问题整理-MySQL

什么是数据库事务&#xff1f; 数据库事务( transaction)是访问并可能操作&#xff08;增删改查都可能有&#xff09;各种数据项的一个数据库操作序列&#xff08;可能有1或多个SQL语句&#xff09;&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割…...

工具函数模板题(蓝桥杯 C++ 代码 注解)

目录 一、Vector容器&#xff1a; 二、Queue队列 三、Map映射 四、题目&#xff08;快递分拣 vector&#xff09;&#xff1a; 代码&#xff1a; 五、题目&#xff08;CLZ银行问题 queue&#xff09;&#xff1a; 代码&#xff1a; 六、题目&#xff08;费里的语言 map&…...

Ansible playbook 简介 使用场景

Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系…...

TS总结10、ts的 class 类型(配置项strictPropertyInitialization、非空断言)

一、简介 1.类&#xff08;class&#xff09;是面向对象编程的基本构件&#xff0c;封装了属性和方法 1.1、属性的类型&#xff1a;类的属性可以在顶层声明&#xff0c;也可以在构造方法内部声明&#xff0c;如果不给出类型&#xff1b;TypeScript 会认为x和y的类型都是any&a…...

leetcode 热题 100_找到字符串中所有字母异位词

题解一&#xff1a; 滑动窗口&#xff1a;类似于字符串匹配&#xff0c;但匹配异位词需要包含相同的字母及个数&#xff0c;可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数&#xff0c;再用Array.equals()进行比对。对于s.length()<p.length()的情况需要特判。…...

百度百科数据爬取 python 词条数据获取

最近需要补充一些电力名词的解释&#xff0c;尤其是文字相关内容。百度百科上的词条质量有差异&#xff0c;因此我们需要先手工选择一些高质量词条。 假设我们选择了互感器页面中的仪用变压器词条&#xff0c;首先&#xff1a; import requests from bs4 import BeautifulS…...

为不同文章形式选择不同的WordPress文章模板

在写文章的时候选择不同的文章形式&#xff0c;然后打开文章的时候会调用不同文章形式的模板。比如&#xff0c;文章形式为video &#xff0c;就调用single-video.php模板&#xff0c;其它文章形式类似&#xff0c;可以添加多个文章样式。 //为不同文章形式的内容添加不同的si…...

MySQL存储引擎及索引机制

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01; MySQL 存储引擎是指 MySQL 数据库管理系统中负责存储和检索数据的组件&#xff0c;它们可以影响数据的存储方式、事务支持、并发性能等方面。而索引则是用于加速检索数据库表中数据的数据结构。下面我将分别…...

Leetcode算法题

二进制求和 给两个字符串a和b&#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 提示&#xff1a; 1 <…...

数据结构之七大排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…...

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…...

嵌入式面试常见问题(四)

1.在基于Linux的网络套接字编程中&#xff0c;如果需要创建一个IPv4的网络套接字&#xff0c;应该在socket函数中指定domain参数为AF_INET 解析&#xff1a; socket()函数创建套接字 函数原型:int socket(int domain, int type, int protocol); domain&#xff1a;协议簇&…...

用Java在Spring Boot项目中,如何传递来传递一个对象(多个参数??

前言&#xff1a; 在前面我们已经了解到&#xff0c;Spring Boot项目中&#xff0c;可以传递一个参数&#xff0c;或者多个参数&#xff0c;但是&#xff0c;随着参数的增加&#xff0c;咱们总不能每增加一个参数&#xff0c;就重新写一段代码吧&#xff1f;&#xff1f;这样显…...

如何利用ChatGPT搞科研?论文检索、写作、基金润色、数据分析、科研绘图(全球地图、植被图、箱型图、雷达图、玫瑰图、气泡图、森林图等)

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

一命通关二分搜索

二分法 简介 和双指针一样&#xff0c;二分法也是一种优化方法&#xff0c;或者说二分法就是双指针的一类。不过&#xff0c;二分法的思想比双指针诞生更早也更广泛&#xff0c;在我们日常生活里也无时不刻在使用二分的思想。 比如我们想回顾某些影片&#xff0c;但是只记得…...

串联所有单词的子串

题目链接 串联所有单词的子串 题目描述 注意点 words[i] 和 s 由小写英文字母组成1 < words.length < 5000可以以 任意顺序 返回答案words中所有字符串长度相同 解答思路 根据滑动窗口哈希表解决本题&#xff0c;哈希表存储words中所有的单词及单词的出现次数&#…...

【会议征稿通知】第四届经济发展与商业文化国际学术会议(ICEDBC2024)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09; The 4th International Conference on Economic Development and Business Culture (ICEDBC 2024) 第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...