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://xiahunao.cn/news/3019036.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

武汉星起航:亚马逊:跨境电商领军平台,中国卖家全球拓展的首选

2015年&#xff0c;亚马逊全球开店业务正式进入中国&#xff0c;为中国卖家带来了全新的跨境电商机遇。如今&#xff0c;亚马逊已在全球拥有包括美国、加拿大、墨西哥、英国、法国、德国等在内的17大海外站点&#xff0c;为中国卖家提供了广阔的销售市场。武汉星起航将详细探讨…

2024年北京服贸会媒体邀约资源有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 2024年北京服贸会&#xff08;中国国际服务贸易交易会&#xff0c;简称CIFTIS&#xff09;作为中国重要的国际性服务贸易盛会&#xff0c;会吸引众多媒体的关注和参与。媒体邀约资源通常…

Linux中每当执行‘mount’命令(或其他命令)时,自动激活执行脚本:输入密码,才可以执行mount

要实现这个功能&#xff0c;可以通过创建一个自定义的mount命令的包装器&#xff08;wrapper&#xff09;来完成。这个包装器脚本会首先提示用户输入密码&#xff0c;如果密码正确&#xff0c;则执行实际的mount命令。以下是创建这样一个包装器的步骤&#xff1a; 创建一个名为…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

有没有国内个人可用的GPT平替?推荐5个AI工具

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

【Windows】VB项目运行报错Run-time error ‘339‘

【Windows】VB项目运行报错Run-time error 339 1.背景描述2.解决办法 1.背景描述 高压电源厂家用vb写了一个上位机软件&#xff0c;到用户windows计算机上运行后&#xff0c; 连接串口报错&#xff1a; Component MSCOMM32.OCX or one of its dependencies not correctly reg…

实现左上角的固定视口但是网格以图片中心放大缩小

仅仅修改了showbk&#xff08;&#xff09; 函数部分&#xff0c;增加bkv4 直接采样&#xff0c;然后粘贴到左上角&#xff0c;实现多余部分裁剪&#xff0c;形成视口内放大缩小 // 程序&#xff1a;2D RPG 地图编辑器与摄像机追随 // 作者&#xff1a;bilibili 民用级脑的研发…

iPhone 数据恢复软件 – 恢复丢失的 iPhone 数据

恢复丢失的 iPhone 数据&#xff0c;奇客数据恢复iPhone版。如今的 iPhone 用户在他们的设备上存储了大量数据&#xff0c;从照片和与亲人的文本对话到商业和医疗信息。其中一些是保密的&#xff1b;其中大部分内容都是非常个人化的&#xff1b;而且大多数一旦丢失就无法替代。…

禅道20.0.stable发布啦,重构底层PHP和UI框架,用户体验全新升级

禅道20.0.stable版本终于正式发布啦&#xff01; 自2023年4月启动以来&#xff0c;经过一年多的努力&#xff0c;我们动员了全公司的产研力量&#xff0c;致力于为用户提供全新的用户体验。 本次版本升级主要包括两个方面&#xff1a;一是用户体验全新升级&#xff0c;二是整体…

软胶囊弹性检测:确保药品质量与患者安全的关键步骤

软胶囊弹性检测&#xff1a;确保药品质量与患者安全的关键步骤 在医药领域&#xff0c;软胶囊作为一种常见的药物载体&#xff0c;其质量的优劣直接关系到药物的有效性和患者的安全。软胶囊的弹性作为其质量评估的重要指标之一&#xff0c;不仅影响其储存和运输的稳定性&#x…

【odoo bug排查】psycopg2.InterfaceError: Cursor already closed

错误日志 Traceback (most recent call last):File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/api.py", line 983, in getcache_value field_cache[record._ids[0]] KeyError: 3During handling of the above exception, another exception occur…

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

[QNX] BSP 网络性能优化:调优io-pkt和ClockPeriod提升网速

0 概要 本文介绍如何在QNX系统上优化网络性能&#xff0c;主要通过调整io-pkt和ClockPeriod参数来实现。通过优化&#xff0c;网络吞吐量可以得到显著提升。 1 优化方法 1.1 调整io-pkt的mclbytes参数: io-pkt是QNX系统中常用的网络协议栈&#xff0c;其mclbytes参数指定了…

如何安全可控地进行内外网跨网络传输文件?

跨网络传输文件通常指的是在不同的网络环境之间移动数据&#xff0c;这在现代企业运营中非常常见。随着网络技术的高速发展&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;企业一般会采用内外网隔离的策略。在进行内外网跨网络传输文件时&#xff0c;需要考虑多种因…

微软exchange邮箱发送

使用java发送exchange类型的邮件&#xff0c;foxmail中配置如下图&#xff1a; 需要的maven依赖如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

报表控件Stimulsoft在JavaScript报告工具中的事件:查看器事件(下)

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

解决ModuleNotFoundError: No module named ‘skfuzzy‘,这个库全名可不叫skfuzzy哦,否则直接报错!!

ModuleNotFoundError: No module named skfuzzy 在这里插入图片描述在这里插入图片描述如何解决 ModuleNotFoundError: No module named skfuzzy 的问题&#xff1f;skfuzzy 模块介绍什么是模糊C均值聚类&#xff1f;skfuzzy 的应用如何使用 skfuzzy 进行模糊聚类 结论 如何解决…

想要品质飞跃?找六西格玛培训公司就对了!

在当今复杂多变的市场环境中&#xff0c;企业的竞争早已不再是单一的价格或产品竞争&#xff0c;而是转向了对品质、效率和创新的全面追求。六西格玛&#xff0c;作为一种全球公认的质量管理方法论&#xff0c;正成为越来越多企业追求品质革命的重要工具。在这其中&#xff0c;…

不盖CNAS的证书就是无效的?证书哪些信息是“非必要”?

做设备校准的企业&#xff0c;大多数都是为了拿到仪器校准证书&#xff0c;而说起校准证书&#xff0c;很多人优先就是想到CNAS&#xff0c;CNAS作为校准行业重要的核心资质&#xff0c;无论是校准机构实力的证明&#xff0c;还是满足企业年审的需要&#xff0c;基本上都是关键…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…