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

0621作业

目录

  • 多线程并发服务器
    • 模型
    • 服务器实现
  • select的TCP服务器
    • 模型
    • 服务器实现
  • select的TCP客户端
    • 实现

多线程并发服务器

模型

sfd = socket();
bind();
listen();
while(1){newfd = accept();pthread_create(&tid, NULL, do_cli_msg, [newfd, cin]集合);pthread_detach(tid);
}
close(sfd);void* do_cli_msg(void* arg){while(1){recv();send();    }close(newfd);
}

服务器实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>#define PORT 8080
#define IP "192.168.124.38"
#define MAX_CLIENTS 5
#define BUFFER_SIZE 1024void *handle_client(void *arg);
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
fd_set readfds;int main() {// 创建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置端口复用if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;                                                                                       address.sin_addr.s_addr = IP;address.sin_port = htons(PORT);// 绑定if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听if (listen(server_fd, MAX_CLIENTS) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("服务器端口:%d...\n", PORT);while (1) {// 接受新的连接请求if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {perror("accept");exit(EXIT_FAILURE);}// 为新连接创建线程pthread_t client_thread;if(pthread_create(&client_thread, NULL, handle_client, (void*) &new_socket) < 0){perror("create thread");exit(EXIT_FAILURE);}// 分离线程,防止资源泄漏pthread_detach(client_thread);}return 0;
}void* handle_client(void* arg){int sock = *((int*)arg);char client_message[BUFFER_SIZE];while(1) {memset(client_message, 0, sizeof(client_message));valread = read(sock , client_message, BUFFER_SIZE);if(valread <= 0){// 发生错误或客户端关闭连接break;}printf("Client %d says: %s\n", sock, client_message);// 处理客户端消息并准备响应char *response = "服务器已就绪\n";send(sock , response , strlen(response) , 0 );}close(sock);printf("关闭socket: %d\n", sock);pthread_exit(NULL);}

select的TCP服务器

模型

sfd = socket();
bind();
listen();
while(1){tempfds = readfds;select(maxfd+1, &tempfds, NULL, NULL, NULL);for(int i=0; i<=maxfd; i++){if(FD_ISSET(i, &temfds) == 0)     continue;if(0 == i){                    }          else if(sfd == i){newfd=accept()FD_SET(newfd, &readfds);maxfd=newfd>maxfd?newfd:maxfd;        }   else{res=recv(i,  );if(0 == res){FD_CLR(i, &readfds);close(i);while(FD_ISSET(maxfd, &readfds)==0 && maxfd-->0);            }send(i,  );        }           }
}
close(sfd);

服务器实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>#define PORT 12345 int main() {int listenfd, newfd, maxfd, i, j, nbytes;struct sockaddr_in server_addr, client_addr;socklen_t addrlen;char buffer[1024];fd_set master_set, read_fds;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = 192.168.124.38;memset(&(server_addr.sin_zero), '\0', 8);if (bind(listenfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {perror("bind");close(listenfd);exit(1);}if (listen(listenfd, 10 ) == -1) {perror("listen");close(listenfd);exit(1);}FD_ZERO(&master_set);FD_ZERO(&read_fds);FD_SET(listenfd, &master_set);maxfd = listenfd;while (1) {read_fds = master_set;if (select(maxfd + 1, &read_fds, NULL, NULL, NULL) == -1) {perror("select");exit(1);}for (i = 0; i <= maxfd; i++) {if (FD_ISSET(i, &read_fds)) {if (i == listenfd) {addrlen = sizeof(client_addr);if ((newfd = accept(listenfd, (struct sockaddr *)&client_addr, &addrlen)) == -1) {perror("accept");} else {FD_SET(newfd, &master_set);if (newfd > maxfd) {maxfd = newfd;}printf("New connection from %s on socket %d\n", inet_ntoa(client_addr.sin_addr), newfd);}} else {if ((nbytes = recv(i, buffer, sizeof(buffer), 0)) <= 0) {if (nbytes == 0) {printf("Socket %d hung up\n", i);} else {perror("recv");}close(i);FD_CLR(i, &master_set);} else {for (j = 0; j < nbytes; j += 0) {int sent = send(i, buffer + j, nbytes - j, 0);if (sent == -1) {perror("send");close(i);FD_CLR(i, &master_set);break;}j += sent;}}}}}}close(listenfd);return 0;
}

select的TCP客户端

实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>#define SERVER_IP "127.0.0.1"  // 服务器 IP 地址
#define SERVER_PORT 12345      // 服务器端口int main() {int sockfd, maxfd, nbytes;struct sockaddr_in server_addr;fd_set read_fds;char buffer[1024];if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);memset(&(server_addr.sin_zero), '\0', 8);if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {perror("connect");exit(1);}printf("Connected to server on socket %d\n", sockfd);while (1) {FD_ZERO(&read_fds);FD_SET(sockfd, &read_fds);FD_SET(STDIN_FILENO, &read_fds);maxfd = (sockfd > STDIN_FILENO ? sockfd : STDIN_FILENO) + 1;if (select(maxfd, &read_fds, NULL, NULL, NULL) == -1) {perror("select");exit(1);}if (FD_ISSET(STDIN_FILENO, &read_fds)) {if (fgets(buffer, sizeof(buffer), stdin) == NULL) {break;}nbytes = strlen(buffer);if (send(sockfd, buffer, nbytes, 0) == -1) {perror("send");exit(1);}}if (FD_ISSET(sockfd, &read_fds)) {if ((nbytes = recv(sockfd, buffer, sizeof(buffer), 0)) <= 0) {if (nbytes == 0) {printf("Server hung up\n");} else {perror("recv");}break;} else {printf("Received from server: %.*s", nbytes, buffer);}}}close(sockfd);return 0;
}

相关文章:

0621作业

目录 多线程并发服务器模型服务器实现 select的TCP服务器模型服务器实现 select的TCP客户端实现 多线程并发服务器 模型 sfd socket(); bind(); listen(); while(1){newfd accept();pthread_create(&tid, NULL, do_cli_msg, [newfd, cin]集合);pthread_detach(tid); } …...

ps基础入门

1.基础 1.1新建文件 1.2创建指定形状 1.4移动工具 1.41移动画布中的任意元素 1.42移动画布 1.43修改画布大小 1.44修改图像大小 1.5框选工具 1.6矩形工具 1.7图层 1.71图层颜色修改 1.72…...

c语言常用易错记录

c语言常用易错记录 文章目录 c语言常用易错记录1.for循环 1.for循环 示例&#xff1a; #include <stdio.h>int main() {int i;for (i 0; i < 10; i) {printf("%d\n", i);}return 0; }执行顺序 备注&#xff1a;此图来源于b站鹏哥C语言视频课截图&#xf…...

制造业ERP五大生产模式详解!

制造业面临着从成本控制、生产效率到供应链管理的挑战&#xff0c;每一个环节都需要精细化的管理和高效的协同。而ERP系统&#xff0c;作为一种集信息技术与管理思想于一体的管理工具&#xff0c;正逐渐成为制造业转型升级的关键。那么&#xff0c;通过本文你将会了解到&#x…...

​Python20 Numpy基础

NumPy&#xff08;Numerical Python&#xff09;是一个开源的Python库&#xff0c;广泛用于科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于处理这些数组的工具和函数。NumPy是数据分析、机器学习、工程和科学研究中不可或缺的工具之一&#xff0c;因为它提供…...

暴雨虐长沙,生灵受煎熬

今天&#xff0c;“湖南长沙市遭遇强降雨,一小时的降雨量足够注满54个西湖”这消息&#xff0c;终于登上互联网社交平台热搜榜。 截图&#xff1a;来源社交网站 综合多家媒体消息概述如下。 昨&#xff08;24日&#xff09;天&#xff0c;湖南长沙市遭遇强降雨&#xff0c;一…...

iptables(5)常用扩展模块iprange、string、time、connlimit、limit

简介 之前我们已经介绍过扩展模块的简单使用,比如使用-m tcp/udp ,-m multiport参数通过--dports,--sports可以设置连续和非连续的端口范围。那么我们如何匹配其他的一些参数呢,比如源地址范围,目的地址范围,时间范围等,这就是我们这篇文章介绍的内容。 iprange扩展模块…...

Mars3d实现汽车尾气粒子效果从汽车屁股开始发射效果

本身的汽车尾气粒子效果&#xff1a;在汽车模型的中间发射的↓↓↓↓↓↓↓↓↓↓↓ Mars3d实例中是使用transY偏移值实现汽车尾气粒子效果从汽车屁股开始发射效果&#xff1a; // 动态运行车辆的尾气粒子效果 function addDemoGraphic4(graphicLayer) {const fixedRoute new…...

01_RISC-V 入门及指令集学习

参考文档 risc-v入门&#xff1a;https://blog.csdn.net/bebebug/article/details/128039038RISC-V OS&#xff1a;https://blog.csdn.net/bebebug/article/details/130551378riscv-spec文档&#xff1a;https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pd…...

Facebook与地方文化:数字平台的多元表达

在当今数字化时代&#xff0c;社交媒体不仅仅是人们交流的工具&#xff0c;更是促进地方文化传播和表达的重要平台。作为全球最大的社交网络之一&#xff0c;Facebook在连接世界各地用户的同时&#xff0c;也成为了地方文化多元表达的重要舞台。本文将深入探讨Facebook如何通过…...

ArmSoM-Sige7/5/1 和树莓派5规格比较

引言 在当今快速发展的嵌入式系统领域&#xff0c;选择一款性能强大、功能丰富的开发板对于项目的成功至关重要。本文将介绍并比较 Sige7、Sige5、Raspberry Pi 5 和 Sige1 这四款开发板的关键规格和特性&#xff0c;帮助开发者和爱好者选择最适合其需求的平台。 ArmSoM-Sige…...

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…...

2024年6月上半月30篇大语言模型的论文推荐

大语言模型&#xff08;LLMs&#xff09;在近年来取得了快速发展。本文总结了2024年6月上半月发布的一些最重要的LLM论文&#xff0c;可以让你及时了解最新进展。 LLM进展与基准测试 1、WildBench: Benchmarking LLMs with Challenging Tasks from Real Users in the Wild Wi…...

Chromium下载

https://chromium.woolyss.com/download/ https://www.chromium.org/getting-involved/download-chromium/...

【Linux】彻底理解---环境变量(什么是环境变量,环境变量有什么作用?)

目录 一、前言 二、什么是环境变量&#xff1f; 三、如何添加环境变量&#xff1f; 四、如何获取环境变量&#xff1f; &#x1f4a7;环境变量相关的命令&#x1f4a7; &#x1f4a7;测试HOME与USER&#x1f4a7; &#x1f525;环境变量的获取方式&#x1f525; ① en…...

VMware完美安装Ubuntu20.04

一、官网下载Ubuntu20.04 下载地址为&#xff1a;https://releases.ubuntu.com/https://releases.ubuntu.com/ 下载完后镜像为ubuntu-20.04.4-desktop-amd64.iso 二、Ubuntu安装 2.1、打开VMware player&#xff0c;并创建新虚拟机。 2.2、点击浏览按钮选择需要安装的镜像 2…...

使用Spring Boot作为CMS系统的后台,Nuxt.js作为前台的分析

在现代Web开发中&#xff0c;前后端分离架构越来越受欢迎。Spring Boot和Nuxt.js的组合为构建内容管理系统&#xff08;CMS&#xff09;提供了一个强大的解决方案。本文将分析这种组合的优势、挑战以及应用场景。 1. 技术概述 1.1 Spring Boot Spring Boot是基于Java的框架&…...

Spring Boot整合Druid:轻松实现SQL监控和数据库密码加密

文章目录 1 引言1.1 简介1.2 Druid的功能1.3 竞品对比 2 准备工作2.1 项目环境 3 集成Druid3.1 添加依赖3.2 配置Druid3.3 编写测试类测试3.4 访问控制台3.5 测试SQL监控3.6 数据库密码加密3.6.1 执行命令加密数据库密码3.6.2 配置参数3.6.3 测试 4 总结 1 引言 1.1 简介 Dru…...

推荐一款好用的编辑工具——onlyoffice桌面编辑器8.1

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;版本更新概览&#x1f697;文档编辑PDF编辑器…...

C++ | Leetcode C++题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.empty()) {return 0;}int n prices.size();k min(k, n / 2);vector<int> buy(k 1);vector<int> sell(k 1);buy[0] -prices[0]…...

操作系统实训复习笔记(2)

目录 Linux操作系统&#xff08;认识记忆&#xff09; &#xff08;1&#xff09;Linux 文件系统是树形层次结构 &#xff08;2&#xff09;Linux 用户介绍 &#xff08;3&#xff09;Linux 常用命令介绍 &#xff08;4&#xff09;ls命令 &#xff08;5&#xff09;Linu…...

北邮《计算机网络》英文选择题课堂小测

课堂小测验及答疑汇总 2020年 5 月 12 日 Q1. Which is the network address after aggregation of following 3 networks: 200.2.50.0/23&#xff0c; 200.2.52.0/22 and 200.2.56.0/22? A. 200.2.48.0/20 B. 200.2.50.0/20 C. 200.2.48.0/21 D. 200.2.50.0/21 Answer: A Q…...

kafka 集群安全认证机制的设计实现

kafka 集群安全认证机制的实现 Kafka 提供了多种安全认证机制来保护数据传输的安全性,包括加密、身份认证和授权。这些机制确保 了 Kafka 集群的通信安全和数据访问控制。以下是 Kafka 安全认证机制的实现和配置指南。 1. 安全认证机制概述 Kafka 支持以下几种主要的安全机…...

pandas保存成CSV格式时数据换行:SQL的REPLACE函数过滤掉数据的回车符

在使用Pandas保存数据到CSV文件时&#xff0c;如果数据中包含换行符&#xff08;例如\n&#xff09;&#xff0c;这可能会导致数据在CSV文件中被分割成多行&#xff0c;影响数据的完整性和可读性。为了解决这个问题&#xff0c;你可以在保存CSV之前使用Pandas的replace函数来替…...

紧贴国家大战略需求,聚焦当前行业热点-海云安D10入选第四届香蜜湖金融科技创新奖拟奖项目

近日&#xff0c;第四届香蜜湖金融科技创新奖终审总结会在深圳市福田区湾区国际金融科技城成功举办&#xff0c;活动现场&#xff0c;专家评审委员会最终揭晓25个拟奖项目。海云安“开发者安全助手系统”项目&#xff0c;实力入选第四届香蜜湖金融科技创新奖-优秀项目奖。 1、香…...

构建 Linux 内核指南

该指南列出了用于构建 Linux 内核的各种目标及其说明。 清理目标&#xff1a; clean - 删除大多数生成的文件&#xff0c;但保留配置文件和足以构建外部模块的构建支持。 mrproper - 删除所有生成的文件 配置文件 各个备份文件。 distclean - mrproper 删除编辑器备份和补丁…...

Elasticsearch的快照

ES的快照是什么&#xff1f; snapshot是一个ES集群或者某个指定索引的备份&#xff0c;快照一般用在 不停机的状态下对ES集群进行备份当硬件故障时恢复集群数据用于跨集群的数据迁移对冷数据或冻结数据做快照以降低存储成本&#xff0c;依赖于可搜索的快照。-收费功能 一个快…...

C/C++混合编译说明

C调用C的函数: C的头文件中声明&#xff0c;被C调用的函数&#xff0c;是以C的方式编译 C的头文件&#xff1a; #ifdef __cplusplus extern "C" { #endif void func_c(void); #ifdef __cplusplus } #endif C调用C的函数&#xff1a; C的源文件中声明&#xff…...

三种方式实现人车流统计(yolov5+opencv+deepsort+bytetrack+iou)

一、运行环境 1、项目运行环境如下 2、CPU配置 3、GPU配置 如果没有GPU yolov5目标检测时间会比较久 二、编程语言与使用库版本 项目编程语言使用c++,使用的第三方库,onnxruntime-linux-x64-1.12.1,opencv-4.6.0 opencv 官方地址Releases - OpenCV opencv github地址ht…...

(四十四)Vue Router的命名路由和路由组件传参

文章目录 命名路由组件传参query参数方式参数传递参数接收 params参数方式参数传递参数接收 props配置方式布尔值形式对象模式函数模式 上一篇&#xff1a;&#xff08;四十三&#xff09;Vue Router之嵌套路由 命名路由 命名路由是为路由配置项提供一个名称&#xff0c;以便…...