LINUX 入门 8

LINUX 入门 8

day10 20240507 耗时:90min 有点到倦怠期了

课程链接地址

第8章 TCP服务器

1 TCP服务器的介绍

开始讲服务器端,之前是客户端DNS+https请求

  1. 基础:网络编程
  2. 并发服务器:多客户端
    1. 一请求,一线程 veryold
    2. IO多路复用,epoll/select上一章讲过了
  3. TCP server百万级连接

借助netassist.exe

2 TCP并发网络网络编程 一请求一线程

tcp server类似酒店迎宾领过去,监听listen

server有对应客户端的连接有socket 连接类似服务员点菜

没懂好多用法

  1. void *client_routine(void *arg){int clientfd = *(int *) arg;
    } 
    

    这是一个使用多线程处理客户端请求的例子。在这个例子中,每个客户端连接都会创建一个新的线程,并且通过 client_routine 函数进行处理。

    下面是对提供的代码片段的解释:

    • void *client_routine(void *arg) 是一个线程函数,用于处理单个客户端连接。
    • int clientfd = *(int *) arg; 将传入参数 arg 解引用为整数类型,并将其赋值给 clientfd 变量。假设传入参数是一个指向整数类型的指针,即客户端套接字描述符。 *(int *) arg;它首先将 arg 强制转换为指向整数的指针,然后使用解引用操作符 * 获取该指针所指向的值。

    你可以在该函数中编写适当的代码来处理客户端请求,例如读取和发送数据等操作。请注意,在每个线程内部需要负责释放相关资源并确保线程安全性。

步骤:

gcc -o tcp_server tcp_server.c -lpthread
./tcp_server 8888

服务器就起来了

打开netassist 改远程地址: 192.168.243.128:8888

在这里插入图片描述

有bug连上了,但是点发送以后收不到!!!

或者是bind error, 没调出来,可能那里打错了,老师的是可以的

  1. 起多个客户端send,如何取区分

    sockfd无法解决,需要应用协议发的内容不同<fromid: xxxx>

  2. 缺点:不适合超多client,内存不够; 用epoll改

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <pthread.h>#include <errno.h>
#include <fcntl.h>#include <sys/epoll.h>
#include <unistd.h> //close要#define BUFFER_LENGTH 1024// 法一 一请求一线程
void *client_routine(void *arg){int clientfd = *(int *) arg;while(1){char buffer[BUFFER_LENGTH] = {0}; // 用于从客户端套接字中接收数据并将其存储到缓冲区中。clientfd:表示要接收数据的套接字文件描述符。buffer:表示接收数据的缓冲区,也就是存放接收到的数据的位置。BUFFER_LENGTH:表示期望接收的最大字节数,即缓冲区的大小。0:表示额外选项,通常设置为 0。int len = recv(clientfd, buffer, BUFFER_LENGTH, 0);if(len < 0){// 没数据,如果阻塞,就是一直等,返回-1// 在非阻塞 I/O 模式下,当没有可用数据时,recv() 函数可能返回 -1 并设置 errno 为 EAGAIN 或 EWOULDBLOCK。这表示当前没有数据可供接收,并且稍后可能会有更多数据可用。因此,这段代码的作用是检测 errno 是否等于 EAGAIN 或 EWOULDBLOCK,以判断是否需要继续等待更多数据的到达。if(errno == EAGAIN ||errno == EWOULDBLOCK){close(clientfd);break;}else if(len == 0){ //disconnectclose(clientfd);break;}else{printf("recv: %s, %d byte(s)\n",buffer, len);}}}
} // 1 socket创建
int main(int argc, char*argv[]){if(argc<2) {printf("param error\n");return -1;}int port = atoi(argv[1]);int sockfd = socket(AF_INET, SOCK_STREAM, 0); //聘请一个迎宾的listenstruct sockaddr_in addr;memset(&addr, 0, sizeof(struct sockaddr_in));addr.sin_family  = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = INADDR_ANY; //任意地址不确定// 0成功 1失败// 函数bind()将套接字与特定的IP地址和端口号进行绑定,以便后续接收来自该地址的连接请求。// 而listen()则表示开始监听连接请求,并指定最大允许等待连接队列的长度为5。这意味着服务器可以同时处理5个未处理的连接请求,超过这个数量的请求将被拒绝或排队等待处理。if(bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0){perror("bind error");return -2;}if(listen(sockfd, 5) < 0){perror("listen error");return -3;} // 2迎宾sockfd 一直等着 为客户client介绍服务员socketwhile(1){struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(struct sockaddr_in));socklen_t client_len = sizeof(client_addr);// 使用accept函数接受来自服务器监听套接字 sockfd 的客户端连接请求,并将客户端的地址信息存储在名为 client_addr 的结构体中。int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len); // 法一 一请求一线程// 请求来了创建线程pthread_t thread_id;pthread_create(&thread_id, NULL, client_routine, &clientfd);}}

3 TCP并发网络编程io多路复用epoll 水平触发与边沿触发

没敲,就看了一下

  1. what is epoll

    超多clients 对server发request

    检测到哪个client发了数据

    1. epoll_create
    2. epoll_ctl control管理 增删改
    3. epoll_wait() 多长时间去一次
#if 0while (1) {struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(struct sockaddr_in));socklen_t client_len = sizeof(client_addr);int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);pthread_t thread_id;pthread_create(&thread_id, NULL, client_routine, &clientfd);}#elseint epfd = epoll_create(1);  struct epoll_event events[EPOLL_SIZE] = {0};struct epoll_event ev;ev.events = EPOLLIN; ev.data.fd = sockfd;epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);while (1) {int nready = epoll_wait(epfd, events, EPOLL_SIZE, 5); // -1, 0, 5if (nready == -1) continue;int i = 0;for (i = 0;i < nready;i ++) {if (events[i].data.fd == sockfd) { // listen struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(struct sockaddr_in));socklen_t client_len = sizeof(client_addr);int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);ev.events = EPOLLIN | EPOLLET; ev.data.fd = clientfd;epoll_ctl(epfd, EPOLL_CTL_ADD, clientfd, &ev);} else {int clientfd = events[i].data.fd;char buffer[BUFFER_LENGTH] = {0};int len = recv(clientfd, buffer, BUFFER_LENGTH, 0);if (len < 0) {close(clientfd);ev.events = EPOLLIN; ev.data.fd = clientfd;epoll_ctl(epfd, EPOLL_CTL_DEL, clientfd, &ev);} else if (len == 0) { // disconnectclose(clientfd);ev.events = EPOLLIN; ev.data.fd = clientfd;epoll_ctl(epfd, EPOLL_CTL_DEL, clientfd, &ev);} else {printf("Recv: %s, %d byte(s)\n", buffer, len);}}}}#endif

一边听,敲,记笔记云里雾里的

  1. 关于io有无数据?如何检测 epoll_wait
    1. 有1 无0
    2. 一种是水平触发EPOLLIN:有没有;一种是边沿触发EPOLLET:检测从无变有

**面试重点:**epoll两种触发,reactor,协程,epoll 在sockfd set集合里

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

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

相关文章

[图解]DDD架构好简单我学会了-学会也没啥用

1 00:00:03,720 --> 00:00:05,920 内部共有&#xff0c;首先是内部的 2 00:00:08,150 --> 00:00:09,220 所以不能说什么 3 00:00:09,630 --> 00:00:10,730 不能跟外部连在一起 4 00:00:10,740 --> 00:00:15,280 比如说&#xff0c;功能架构&#xff0c;可以吗 …

Linux中gitlab-runner部署使用备忘

环境&#xff1a; 操作系统:&#xff1a;CentOS8 gitlab版本&#xff1a;13.11.4 查看gitlab-runner版本 可以从https://packages.gitlab.com/app/runner/gitlab-runner/search找到与安装的gitlab版本相近的gitlab-runner版本以及安装命令等信息&#xff0c;我找到与13.11.4相…

便签怎么设置不同的标签 便签创建不同分组标签的方法

在日常工作和生活中&#xff0c;便签已成为我随身携带的小助手。每当灵感闪现&#xff0c;或是需要临时记录一些重要事项&#xff0c;我都会随手打开便签&#xff0c;快速记录下来。然而&#xff0c;随着记录的内容越来越多&#xff0c;如何高效地管理和查找这些信息成为了一个…

分布式关系型数据库管理系统 OceanBase 安装和配置教程

&#x1f30a; 分布式关系型数据库管理系统 OceanBase 安装和配置教程 &#x1f680; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝…

js自定义实现类似锚点(内容部分滚动)

场景&#xff1a; 效果图如上&#xff0c;类似锚点&#xff0c;但是屏幕不滚动。高度计算我不是很熟练。for循环写的比较麻烦。element plus 和Ant Design有类似组件效果。 html&#xff1a; <template><div><div style"height: 400px;" class&q…

入门视频剪辑:视频合并不再难,批量嵌套合并的简单步骤

在数字媒体时代&#xff0c;视频剪辑已成为一项基本技能。无论是制作家庭电影、公司宣传片还是在线教育内容&#xff0c;视频剪辑都扮演着重要角色。对于初学者来说&#xff0c;视频剪辑可能看起来有些复杂&#xff0c;但掌握了正确的步骤和技巧后&#xff0c;你会发现它其实并…

共享WiFi项目加盟骗局:共享WiFi贴码收益真的月入过万?

如今每个人的手机都是智能手机&#xff0c;我们几乎随时随地都需要网络的陪伴。而随着共享经济的概念深入人心&#xff0c;一种名为“共享WiFi贴码”的新兴事物逐渐走入了我们的视线。据说通过这种方式&#xff0c;人们可以实现轻资产创业&#xff0c;甚至有人声称能借此达到月…

HTTPS对于网站到底价值几何?

现在HTTPS基本上已经是网站的标配了&#xff0c;很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象&#xff0c;当时只有几家大型互联网公司的网站会使用HTTPS&#xff0c;大部分使用的都还是简单的HTTP&#xff0c;这一切是怎么发生的呢&#xff1f; 为什么要把网站…

crossover不能生成容器 无法创建容器怎么办

CrossOver不能生成容器&#xff0c;我们应该先了解什么是容器&#xff0c;容器是盛放类虚拟机——CrossOver在macOS系统和Linux系统下载的win版软件的器皿。无法创建容器怎么办&#xff1f;无法创建多数情况是macOS系统与CrossOver不兼容所造成的。 首先&#xff0c;我们将介绍…

Elasticsearch中对文章进行索引和查重

解决思路 要在Elasticsearch中对文章进行索引和查重&#xff0c;可以按照以下步骤操作&#xff1a; 安装Elasticsearch并启动服务。 安装Python的Elasticsearch客户端库&#xff0c;可以使用pip install elasticsearch命令进行安装。 编写Python代码&#xff0c;使用Elastic…

WebDAV之π-Disk派盘 + 溯记

“溯记”是一款提供丰富功能的时间轴日记应用,旨在帮助用户记录生活中的碎片化想法和事件,并提供便捷的回顾和管理功能。根据您提供的描述,这款应用具有丰富的特性,包括时间轴浏览、多媒体支持、实时存储、模糊搜索、日历视图、故事关联和随机回溯。这些功能将帮助用户记录…

【如何在本地安装Llama 3,坐好30秒!稳的很!!】

如何在本地安装Llama 3&#xff0c;30秒闪速教程 点击 Ollama官网 点击对应系统内容进行下载 解压后打开文件: 双击后打开 复制 打开CMD 窗口终端 复制黏贴 ollama run llama3 等下载完成 OK&#xff0c;安装完成&#xff01; 输入问题&#xff0c;愉快玩耍&#xff01; …

俄罗斯副总理暗示欧佩克+或增加原油产量,亚洲早盘油价小幅下跌

在俄罗斯副总理亚历山大诺瓦克暗示欧佩克可能采取行动增加原油产量后&#xff0c;亚洲早盘的油价出现小幅下跌。这一消息引起了市场对原油供给增加的担忧&#xff0c;导致油价走低。 City Index和FOREX.com的市场分析师Fawad Razaqzada表示&#xff0c;虽然原油价格在技术上尚…

IDEA远程连接docker服务,windows版docker desktop

1.windows上安装docker desktop docker desktop下载地址&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 有的windows系统不支持安装docker desktop 安装完之后我们可以直接打开&#xff0c;可以选择不登录使用 我们用IDEA连接到docker …

Pikachu 靶场 CSRF 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

嵌入式C语言高级教程:实现基于STM32的面部识别系统

面部识别技术在安全和自动化领域越来越受到重视。本教程将指导您如何在STM32微控制器上使用OpenMV实现基本的面部识别功能。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32H743II&#xff0c;具备高性能处理能力和充足的存储资源。开发板&#xff1a;STM32H7 Discov…

恢复数据,电脑数据恢复详细操作指南(4个方法)

“我经常会把很多重要的文件都保存在电脑上&#xff0c;但今天在清理电脑时好像误删了一些数据&#xff0c;有没有比较好用的数据恢复方法可以分享一下呢&#xff1f;请大家给我推荐几个吧&#xff01;” 随着电脑的普及&#xff0c;我们越来越多地将重要数据存储在电脑中。然而…

pdf2htmlEX:pdf 转 html,医学指南精细化处理

pdf2htmlEX&#xff1a;pdf 转 html&#xff0c;医学指南精细化处理 单文件转换多文件转换 代码&#xff1a;https://github.com/coolwanglu/pdf2htmlEX 拉取pdf2htmlEX 的 Docker&#xff1a; docker pull bwits/pdf2htmlex # 拉取 bwits/pdf2htmlex不用进入容器&#xff0c…

认识设计模式SOLID原则

SOLID 是一个缩写词&#xff0c;代表面向对象编程 (OOP) 的五个设计原则&#xff0c;旨在促进更简单、更健壮和可更新的代码。 SOLID 缩写中的每个字母都代表了开发易于维护和随时间扩展的软件的原则。 SOLID原则是面向对象编程和设计的五项基本指导原则&#xff0c;由罗伯特C…

用HAL库改写江科大的stm32入门例子_9-1 串口发送

设置串口&#xff1a; 选项说明&#xff1a; 写一个串口发送函数&#xff1a; // serial send string function void serial_send_string(char *str) {HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 1000); } main函数中调用发送信息&#xff1a; uint8_t dat…