服务器
文章平均质量分 88
ze言
c/c++ Qt opencv linux
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Python实现一个简单的HTTP服务器(GET/POST)
首先用户在browser里输入URL,然后browser发送request message给server,接着server在文档库里找到这个URL对应的文件,然后返回response message给client (browser),最后由browser显示出来。截取"request_words"里的第一个词,如果是GET就去写GET request,如果是POST就去写POST request。写requests message:实现GET和POST requests的HTTP server。......原创 2022-08-12 15:42:49 · 13263 阅读 · 0 评论 -
C++的跨平台(Linux)开发——总结
设备和文件IO Linux 内核函数 内核函数和API区别(fopen、open) API函数通过库函数 进行操作 内核直接操作硬件 从效率上:内核函数比库函数快 从移植性上:内核几乎无法跨操作移植,库函数比较方便 文件操作 open函数 read函数 阻塞式函数——没读取到内容是不会往下执行的 wirte函数 create函数 close函数 lseek函数 fcntl函数 文件夹操...原创 2022-05-25 12:29:22 · 1424 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.7)——服务器SOCKET封装
一、TCP编程通信本质——处理三个半事件建立连接——服务器accept等待客户端、客户端connect连接服务器 断开连接——主动断开close、shutdown、被动断开read返回0 消息到达——接收数据read(对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等) 消息发送完毕——发送数据write(算半个事件)二、面向对象方式封装IO类封装―—读写二次封装 ——读写重载 地址类(CHostAddress)——地址偏移 socket接口基类.原创 2022-04-07 20:19:42 · 916 阅读 · 3 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.6)——SOCKET-IO复用技术
一、前言首先来分析一下进程版通信和线程版通信利用进程,一个客户端一个进程 利用线程,一个客户单一个线程进程是资源分配的基本单位,如果客户端数量剧增,每一个进程都会有代码段、数据段、堆栈段,所以使用进程开销大, 且进程间数据还不能共享,也不可能每个进程都写一个IPC实现通信。如果使用线程,一个进程如果开出N个线程,一旦这个进程被杀死,就会导致N个线程全部销毁。而且在一些计算机上一个进程最多开300个进程(现实中肯定不够用,就像QQ平均每天在线人数达到7亿多),但这时候操作系统也被卡死了。线原创 2022-04-04 20:44:27 · 819 阅读 · 0 评论 -
C++跨平台开发——Linux下QT实现客户端聊天的六大细节
其中,Write 是为了发出账号密码(点击登录按钮),read是为了判断登录成功(聊天界面)还是失败(登录界面)1、读写两个线程定义成两个单例类登录界面和聊天界面等界面都要实现读写线程,因为功能基本一样,可以把它们整合为单例类定义单例的网络连接类网络连接之后的socket是重要的这样就可以在多个窗口同时使用(不能直接在窗口里面创建线程)2、QT做客户端,何时打开网络连接?①按下登录按钮(构造函数中准备好所有数据——获取socket传到读、写线程——此时没有打...原创 2022-04-04 09:21:08 · 972 阅读 · 0 评论 -
C++跨平台开发——SOCKET网络编程中实现客户端对聊
一、案例C++跨平台开发——关于解决SOCKET网络编程中客户端对聊的问题二、实现分析1、为什么服务器开启线程而不是进程?线程的开销小,启动快,共享数据(不需要ipc就可以实现交互),所以一个线程一个客户端(效率提升将近10倍。2、创建线程的时候传accepfd的原因accepfd记录客户端,客户端每上线一个就覆盖一个accepfd,第一个accepfd就没了,利用值传参并保存下来。线程永远都停留在死循环内,保存下来的fd就不会被替换掉。(知道客户端下线)3、自定义通信协议原创 2022-04-02 16:32:42 · 4278 阅读 · 1 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.5)——线程同步
一、前言首先来回顾一下cpu的随机轮转机制顺序随机(固定优先级情况下) 时间随机(可能有固定时间,就像鸿蒙OS芯片是10毫秒) 次数随机其次是进程与线程的区别1、进程是资源分配的基本单位,线程是CPU调度的基本单位 2、一个进程中可以包含n条线程,n条线程同时共享当前进程的所有资源 3、进程无法共享数据(要通过IPC),在一个进程内多条线程可以共享数据计算机会为一个进程开辟磁盘、内存和cpu等,用进程来计算,进程再开出线程,线程的开辟更加的节省资源开销,线程再共享当前进程的所有资源原创 2022-03-31 11:06:07 · 1750 阅读 · 2 评论 -
C++跨平台开发——关于解决SOCKET网络编程中客户端对聊的问题
前面我们在SOCKET网络编程学习中,简单实现了服务器为客户端单独开一个进程,客户端网络连接成功之后可以输入数据,并陆续给服务器发送消息,服务器则实现读取操作。那么如果想要让客户端和客户端进行聊天该怎么办?...原创 2022-03-28 08:39:46 · 3072 阅读 · 3 评论 -
C++跨平台开发——解决共享内存实现进程互发消息的BUG
在之前写的利用共享内存实现进程间发送消息中,如果细心的同学可能发现了一系列的问题,基于大佬的讲解,我对出现的BUG做了一些分析和总结C++跨平台开发——共享内存实现进程间发送消息一、共享内存没有写成功就去读首先请思考读端什么时候读数据?即什么时候能让你知道共享内存中有了数据?因为读的时候直接就memcpy了,本来在调用memcpy之前应该有一个逻辑在证明共享内存中有数据,这样的逻辑才是正常的,如果共享内存中还没有数据的话memcpy出来就是内存中的乱码。但是你又需要读出来才知道共享内存中原创 2022-03-27 21:44:44 · 2191 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.4)——多线程
学习目标:线程的概念 线程和子进程的区别 线程的实现 线程同步 信号灯 互斥量和条件变量在一个程序里的多个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程进程是资源分配的基本单位,线程是cpu调度的基本单位 fork和创建新线程的区别当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID。这个新进程的运行时间是独立的,它在执行时几乎完全独立于创建它的进程在进程.原创 2022-03-27 21:02:19 · 2329 阅读 · 1 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.3)——消息队列
一、引言先来聊聊数据结构中的队列(如下图),队列具有先进先出的特点,其实就很像我们现实生活中做核酸、打疫苗排队一样。你去做核酸会先在队尾排,然后队列里面的人一直往前进,对头的人先做核酸,做完接着下一个,依次进行。那么IPC通信中的消息队列也类似这样。二、消息队列概述消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列...原创 2022-03-27 16:36:52 · 1912 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.2)——SOCKET网络编程
socket概述 为了简化开发通信程序的工作,由Berkely学校开发了一套网络通信程序的API函数标准 socket标准被扩展成window socket和unix socket linux中的网络编程通过socket接口实现。Socket既是一种特殊的IO,它也是一种文件描述符。一个完整的Socket 都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每一个Socket 有一个本地的唯一Socket 号,由操作系统分配。...原创 2022-03-26 09:57:43 · 5429 阅读 · 2 评论 -
基于VS2019 C++的跨平台(Linux)开发(2.1)——网络基础
一、知识点SOCKET利用了网络在两台电脑中实现通信,也是属于ipc通信服务器达到了中转站的效果(qq两端聊天经过腾讯公司的服务器)那么中间为什么要经过这个服务器呢(对方主机不在线也能给他发消息)IP地址:确定网络中某一台计算机的位置ipconfig中ipv4地址是虚拟的,连接的wifi的ip地址,通过路由器转换的网络中如何找到对方呢?向运营商申请域名,通过这个域名找到ip地址,域名方便用户使用记忆端口号用来确定是哪个应用程序(进程)收,注意不是pid通信协议:通信原创 2022-03-25 20:06:04 · 6327 阅读 · 0 评论 -
C++跨平台开发——共享内存实现进程间发送消息
一、实现要求二、实现思路连接共享内存 读取数据(内存拷贝) 读取数据(内存拷贝) 断开共享内存的连接三、代码#include <iostream>#include <sys/shm.h>#include <sys/ipc.h>#include <stdio.h>#include <string.h>using namespace std;typedef struct chat{ char uid[10];原创 2022-03-24 16:52:10 · 1622 阅读 · 0 评论 -
C++跨平台开发——有名管道的通信实现回合制伪聊天
一、实现要求二、实现思路A到B,先写再读;B到A,先读再写 读是阻塞函数,如果A不给B发,则B读不到内容就不能发下一句。要读到内容走完循环才能再写(输入),然后发送给A,以此实现回合制聊天。 管道是半双工的,不能同时用一个管道写和读,要创建两个。三、代码A进程代码如下,B进程类似#include <unistd.h>#include <stdio.h>#include <fcntl.h>#include <iostream&g原创 2022-03-24 15:17:26 · 632 阅读 · 0 评论 -
C++跨平台开发——带参数信号实现进程间数据传递
一、实现要求二、实现思路大致结构:信号绑定函数(触发函数)如下确定A\B\C\D四个进程的关系是父子关系:A fork B、B fork C、C fork D(或者A是父亲,BCD都是A的孩子;再或者main函数是父亲,ABCD是兄弟也可以)此时D就是A的重孙子,可以看出B、C既有父亲也有孩子;A有孩子没有父亲;D有父亲没有孩子。那么怎么区分B、C呢?因为触发函数中有num(收到的信号编号),B、C收到的信号不同,所以可以根据num判断(num为10表示信号SIGUSER1.原创 2022-03-24 10:46:38 · 1573 阅读 · 2 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.5)——共享内存
一、引言之前的管道学习中,我们利用命名管道生成了两个.fifo的文件,如果用户不懂技术,以为这个文件没用就可能把它们删除了。此外,因为管道(不管是命名管道还是匿名管道)能够容纳的最大数据是有限的(65535字节),你不断的往管道里面写数据, 如果超过这个容量就可能导致管道损坏。(就像水管承载的水量是有限的,超过一定的水压就可能爆裂),所以总结起来就是管道容易被误删,管道容量有上限。那么接下来就涉及到了共享内存。二、共享内存概述共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的原创 2022-03-23 22:23:48 · 2524 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.4.3)——信号屏蔽
信号集操作函数#include <signal.h>/* Clear all signals from SET. */int sigemptyset(sigset_t *set);// 清空信号集/* Set all signals in SET. */int sigfillset(sigset_t *set);// 所有信号加进去 32 33 是没有的int sigaddset(sigset_t *set, int signo);// 增加信号int sigdelset...原创 2022-03-23 12:33:32 · 908 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.5)——管道
一、管道概述1.1、管道概念管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流(文件IO流)称为一个“管道”。1.2、管道特点管道是半双工的,数据只能向一个方向流动(单行道);如果要进行双向通信,必须建立起两个管道(从定义后就不能更改)。 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。 单独构成一种独立的文件系统:管道对于管道两端的进程而原创 2022-03-19 20:50:26 · 2334 阅读 · 0 评论 -
c++ 文件拆分与合并——结合linux进程管理wait/waitpid
一、主线思路1、拆分:读一个文件写多个文件2、合并:读多个文件写入到一个文件3、父子进程:必须等待子进程拆分之后才合并(if 、else if结构,如下)原创 2022-03-18 09:55:25 · 2866 阅读 · 4 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.4.2)——带参数信号
信号在内核中的表示(2-1)执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:信号在内核中的表示(2-2)实时信号早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(.原创 2022-03-18 00:36:15 · 1494 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.4)——不带参数信号
一、目标信号概念 信号安装signal、sigaction 信号集操作函数 时钟二、信号1、概念信号是系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。可以是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等 进程可以生成信号、捕捉并响应信号或屏蔽信号2、用途进程间通信,之前提到进程之间的数据是不能进行互通的,所以就要用到进程间通信技术,这个信号就是其中之一 ,就类似Qt里面的信号和槽(在界面切换的时候可以用到),(开发Qt的时候实际他就是参照原创 2022-03-17 22:13:54 · 924 阅读 · 1 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.3.3)——进程管理
二、守护进程守护进程,也就是通常所说的精灵进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事情。守护进程是在后台运行不受终端控制的进程;是能自动转到后台并且脱落与终端的联系;linux系统中一般有很多守护进程在后台运行 ,执行不同的管理任务。守护进程的特性:后台运行 必须与运行钱的环境隔离开来 启动方式尤其特殊之处守护进程运行环境:包括未关闭的文件描述符、控制终端、会话和进程组,工作目录以及文件创建掩膜等这些原创 2022-03-16 11:51:03 · 821 阅读 · 3 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.3.2)——进程管理
二、wait和waitpid什么是阻塞?可以理解为堵在了程序某个地方无法往下走如read函数,读不到任何字符的时候就会阻塞,直到读到一个字符为止。(有一个状态会让它结束阻塞,即读到一个字符)。 阻塞后,这时这个函数也没有返回值,后面一系列所有的函数都不能运行。阻塞不是死循环,死循环没法结束,但是阻塞是可以结束的,等待某一个状态就结束卡死的状态原创 2022-03-13 16:33:44 · 3598 阅读 · 5 评论 -
关于解决Linux(ubuntu) 中不允许root用户ssh远程登录的问题
有时,我们登录SSH的时候,会出现如下问题:原创 2022-03-11 12:46:19 · 27419 阅读 · 6 评论 -
基于VS2019 C++的跨平台(Linux)开发——引入
一、前言先声明我的服务器是Ubuntu16.04,由标题可知,我的开发工具采用Visual Studio2019,使用c++y语言来实现windows-linux的跨平台开发。二、关于跨平台1. 什么是跨平台?由百度百科可知,跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。跨平台的定义就是指程序语言、软件或硬件设备可以在多种作业系统或不同硬件架构的电脑上运作。简单来说,本文的跨平台就是,一份代码,在原创 2022-03-11 12:37:38 · 6138 阅读 · 1 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.1)——环境搭建
一、版本确认Ubuntu 系统版本确认是否为Ubuntu 16.04,注意 不是VMware版本!二、修改Ubuntu系统 root用户的登录权限1、使用:sudo passwd -u root设置root的密码2、使用su root来测试是否可以进入root用户,如果出现#说明已经设置root用户的密码成功3、进入到/usr/share/lightdm/lightdm.conf.d/目录,使用gedit 50-unity-greeter.conf &命令打开50-unity-g原创 2022-03-06 20:47:33 · 3692 阅读 · 0 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.3)——进程管理
一、引言进程、子进程和僵进程 子进程的创建以及父子进程关系 fork,exec,system,wait,waitpid系统调用 如何避免“僵尸”进程?二、进程概念1、进程与程序程序是一个简单的实体,说白了,程序是存放在磁盘文件中的可执行文件,某些操作系统用任务表示正被执行的程序。进程是程序的一次执行,是运行在自己的虚拟地址空间的一个具有独立功能的程序。2、进程与进程ID程序的执行实例被称为进程,每个进程都一定有一个唯一的数字标识符,称为进程ID,(一定是非负整数)3、linu原创 2022-03-09 20:50:11 · 1448 阅读 · 7 评论 -
基于VS2019 C++的跨平台(Linux)开发(1.2.2)——设备管理及文件IO
接上一篇文章,我们来学习其他的一些系统调用等等Linux——设备管理及文件IO(一)9、lseek系统调用作用:通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置函数原型:off_t lseek(int fd, off_t offset, int base);参数: fd:需设置的文件标识符 offset:偏移量 base:搜索的起始位置返回值: 返回新的文件偏移值...原创 2022-03-09 08:29:59 · 1394 阅读 · 4 评论
分享