![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C网络通信
讳疾忌医丶
君子修身养德,不以穷困而改志
展开
-
Linux c AES加密
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <openssl/aes.h>int main(){ // aes数据加密 char* mykey = "0123456789abcdef"; AES_KEY aes; AES_set_encrypt_key(mykey, 128, &aes); // 需要加密的字符串 int length;原创 2021-12-16 12:39:33 · 2738 阅读 · 0 评论 -
Linux C++ 使用ASN.1对报文进行编辑码
文章目录1、c语言使用2、使用说明3、使用流程1、c语言使用[C语言使用 ASN.1对报文进行编解码(将c函数封装成类简化使用)](https://blog.csdn.net/weixin_45715405/article/details/121651519?spm=1001.2014.3001.5501).2、使用说明代码下载:链接:https://pan.baidu.com/s/156-jWSx3ZKtjXaZafRtZ-w 提取码:5bbd类说明1、BaseASN1.h和Base原创 2021-12-10 18:09:39 · 1187 阅读 · 0 评论 -
Linux c++ OpenSSL(hmac)
#include <openssl/hmac.h>#include <openssl/sha.h>#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;int main(){ // 第一种方法 char key[] = "123456"; unsigned char data[] = "hello原创 2021-12-05 17:41:10 · 836 阅读 · 0 评论 -
Linux c++ 共享内存类封装
文章目录1、1.1、ShareMemory.h1.2、ShareMemory.cpp1.3、SecKeyShm.h1.4、SecKeyShm.cpp1.5、main.cpp1、1.1、ShareMemory.h#pragma once#include <sys/ipc.h>#include <sys/shm.h>const char RandX = 'x';class ShareMemory{public: ShareMemory(int key);//原创 2021-12-04 23:42:31 · 918 阅读 · 0 评论 -
Linux c 通过共享内存实现IPC进程间通信
文章目录1、使用流程1.1、创建或者获取共享内存ID1.2、连接共享内存1.3、断开与共享内存关联1.4、设置或者删除共享内存2、使用2.1、向共享内存中写数据2.2、向共享内存中读数据3、比较shm和mmap差别1、使用流程共享内存的实质是将内核的一块内存映射到进程中的内存,操作本地内存就相当于操作内核内存使用步骤:1、创建共享内存2、关联共享内存3、使用共享内存(读写共享内存)4、断开与共享内存的关联5、删除共享内存1.1、创建或者获取共享内存IDint shmget(key_t原创 2021-12-03 22:13:49 · 1129 阅读 · 0 评论 -
Visual Studio 2019连接 Linux
https://www.cnblogs.com/wangshaowei/p/10904796.html原创 2021-12-01 12:17:21 · 661 阅读 · 0 评论 -
C语言使用 ASN.1对报文进行编解码(将c函数封装成类简化使用)
文章目录1、为什么要报文编解码2、ASN.1是什么3、使用函数介绍4、对数据进行编解码使用1、为什么要报文编解码两台机器通信:1、两台机器的操作系统可能不同2、网络传输数据用的是大端模式3、字节序对齐不一样2、ASN.1是什么ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代原创 2021-12-01 11:46:15 · 3729 阅读 · 1 评论 -
Window 制作静态库、动态库,使用
文章目录1、静态库2、使用静态库2、动态库制作2.1、动态库使用1、静态库1、创建一个空项目2、添加一个.h文件(函数声明),.c文件(函数实现)3、项目属性栏中修改为静态库4、生产代码5、打开文件所在位置,文件的上层有一个Debug目录下.lib后缀就是生产的静态库 2、使用静态库1、使用静态库,一般都会给你两个文件,一个.h(一些描述信息,和声明),.lib(库文件,代码实现)2、将两个文件拷贝到当前项目目录下,vs上添加现有项,将这两个添加进来3、包含头文件,调用add函原创 2021-11-29 16:52:09 · 885 阅读 · 0 评论 -
centos7 (window) 上安装openssl库,测试使用环境
文章目录1、解压2、安装3、检查是否安装成功4、解决1、解压将包上传到服务器,并解压,解压出来是openssl-master文件夹,进入文件夹unzip openssl-1.1.1-pre6-dev.zipcd openssl-master/2、安装./configmake(root用户下)make install3、检查是否安装成功openssl version -a要是执行这条命令报错以下错误:openssl: error while loading shared li原创 2021-11-27 01:10:09 · 1285 阅读 · 0 评论 -
c语言 二叉树(先序、中序、后序(递归和非递归法)、拷贝、释放、树的高度、叶子数)
文章目录1、基础概念1.1、先、中、后(序)2、代码实现2.1初始化和上图一样结构的一棵树2.2、递归遍历2.3、二叉树叶子数2.4、树的高度2.5、拷贝二叉树、销毁2.6、整体功能测试3、非递归先、中、后(序)遍历3.1、代码实现3.2、c语言创建栈的代码3.3、完整使用1、基础概念叶子:没有后续节点双亲:直接前驱节点节点度:直接后继的节点数树的度:节点的度中取最大的值性质1:在二叉树的第i层上至多有2^(i-1)个节点(i>0)性质2:深度为k的二叉树至多有(2^k)-1个节点(k原创 2021-11-22 19:23:27 · 1222 阅读 · 0 评论 -
c语言 实现队列(插入,删除,头部,尾部,销毁)
文章目录1、代码1、代码#include <stdio.h>#include <stdlib.h>#include <string.h>// 节点结构体struct QueueNode{ struct QueueNode* next;};// 队列结构体struct LQueue{ struct QueueNode phade; struct QueueNode* ptail; int m_size;};ty原创 2021-11-21 23:11:53 · 1642 阅读 · 0 评论 -
c语言 栈使用案例
文章目录1、栈面试题,就近匹配2、中缀表达式转后缀表达式2.1、后缀表达式运算1、栈面试题,就近匹配检测字符串是否缺括号:5+5*(6)+9/3*1)-(1+3(思路:1、从第一个字符开始扫描当遇见左括号时压入栈中遇到右括号时,弹出栈中元素匹配成功:继续读入下一个字符匹配失败:立即停止,并且报错成功:所有字符扫描完毕,且栈为空失败:匹配失败或所有字符完毕栈非空#include <iostream>#include <stack>using name原创 2021-11-20 22:37:57 · 321 阅读 · 0 评论 -
c语言 两种创建栈方式(顺序存储、链式存储)
文章目录1、顺序存储方式1.1、初始化1.2、push入栈1.3、pop出栈1.4、栈顶元素1.5、栈大小1.6、栈是否为空1.7、栈销毁测试2、链式存储2.1、初始化2.2、push入栈2.3、pop出栈2.4、栈顶元素2.5、栈大小2.6、栈是否为空2.7、栈销毁测试1、顺序存储方式使用一个void*类型的数组首地址,作为栈底,这样符合栈先进后出原理,要是首地址做栈顶,需要多次移动数组元素比较麻烦1.1、初始化#define MAX 1024// 栈地址结构,因为内部维护一个数组所以需要给原创 2021-11-19 00:25:39 · 1191 阅读 · 0 评论 -
c语言 单向链表企业版(插入、遍历、删除、销毁)
文章目录1、功能介绍1.1、链表结构体设计1.2、链表初始化1.3、插入1.4、遍历1.5、删除1.6、销毁2、代码1、功能介绍1.1、链表结构体设计链表节点只维护指针域,数据域,由用户给// 链表结构体结构体struct Link{ struct Link* next; // 只维护指针域};// 用来维护链表struct Links{ struct Link head; // 链表头节点 int m_size; // 链表节点个数};// 自定义类型原创 2021-11-18 19:57:01 · 704 阅读 · 0 评论 -
Linux c udp广播
文章目录1、对比2、代码2.1、服务端2.2、客户端1、对比服务端:需要利用这个函数开发套接字的发广播权限,并且需要客户端地址绑定为广播地址setsocket(sockfd,SOL_SOCKET,SO_BROADCAST,&flag,sizeof(flag));客户端没有什么变化2、代码2.1、服务端#include <stdio.h>#include <ctype.h>#include <string.h>#include <ar原创 2021-11-18 09:48:57 · 468 阅读 · 0 评论 -
c语言 实现动态数组(增、删、遍历、销毁)
文章目录1、功能介绍1.1、初始化动态数组1.2、向动态数组中插入元素1.3、通过下标删除元素1.4、通过元素值删除元素1.5、遍历数组1.6、销毁动态数组2、实现2.1、main.c文件2.2、"dynamicArray.h"文件2.3、"dynamicArray.c"文件1、功能介绍1.1、初始化动态数组动态数组主要维护:这个这个结构体typedef struct dynamicArry{ void** pAddr; // 数组指针 int m_size; // 数原创 2021-11-18 00:10:33 · 2623 阅读 · 0 评论 -
Linux c UDP 实现组播发送数据
文章目录1、服务器端2、客户端1、服务器端服务器端的struct ip_mreqn group和客户端的意义不同,服务器端是设置组播地址,客户端是将自己添加到组播组中#include <stdio.h>#include <ctype.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include &l原创 2021-11-17 18:46:10 · 2515 阅读 · 0 评论 -
Linux c 网络项目(epoll结合http协议显示服务器目录结构)
文章目录1、epoll上添加内容2、代码3、使用1、epoll上添加内容是目录进入目录,要是是文件显示,图片可以下载只是在以前的epoll服务器版本上,对读、写,添加了一些http协议的东西。1、先写一个epoll非堵塞ET模式服务器,然后对读写进行加东西2、读:浏览器发来请求,读取第一行http协议(GET 文件名 协议号)3、写:根据内容信息,将对应的http头信息发回去,然后发数据4、判断读到的文件名是不是普通文件还是目录: 普通文件:先发回http对应头信息,然后将文件内容发原创 2021-11-16 21:38:15 · 518 阅读 · 0 评论 -
Linux c libevent库实现TCP服务器
文章目录1、带缓冲区事件函数使用流程2、代码1、带缓冲区事件函数使用流程安装: Linux c libevent库安装(简单使用)原理:bufferevent 有两个缓冲区:也是队列实现,读走没,先进先出读缓冲:有数据–>读回调函数被调用–>使用bufferevent_read()函数读–>读数据写缓冲:使用bufferevent_write()–>向写缓冲中写数据(写缓冲一旦有数据就会将数据发给对端,然后在调用设置的写回调函数,所以写回调有点鸡肋)–>该缓冲区有原创 2021-11-14 22:45:39 · 2749 阅读 · 0 评论 -
Linux c libevent库监听管道读写(mkfifo)
文章目录1、libevent流程2、代码1、libevent流程1、创建 底座 struct event_base* event_base_new(void);2、创建常规事件回调函数类型: typedef void(*event_callback_fn)(evutil_socket_t fd,short,void*)struct event* event_new(struct event_base* base,evutil_socket_t fd,short what,event_cal原创 2021-11-13 12:53:07 · 1635 阅读 · 0 评论 -
Linux c 本地套接字IPC通信
文章目录1、TCP使用差异2、代码1、TCP使用差异1、创建socket参数第一个参数改变int socket(int domain,int type,int protocol)参数: domain:AF_UNIX 其他参数和原来一样2、地址结构由原来sockaddr_in到sockaddr_un3、bind函数调用成功,会创建一个socket文件,因此保证bind成功,通常我们在bind之前,可以使用unlink("socket文件名")4、客户端不能依赖“隐式绑定”,并且应该在原创 2021-11-13 10:54:16 · 1116 阅读 · 0 评论 -
Linux c UDP使用
文章目录1、函数介绍2、代码1、函数介绍UDP不需要连接,所以也就没有三次握手,不需要accept和connect函数,UDP主要用下面两个函数// recvfrom函数ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);参数: sockfd:lfd buf: 缓冲区地址 len: 缓冲区大小原创 2021-11-12 17:49:35 · 2589 阅读 · 0 评论 -
Linux c libevent库安装(简单使用)
文章目录1、下载安装包2、安装1、下载安装包libevent-2.1.8-stable.tar.gz链接: https://pan.baidu.com/s/1B68fGCpFX4y6saLraUi2cA 提取码: 0tut也可以去官网下载https://libevent.org/2、安装1、解压tar -zxvf libevent-2.1.8-stable.tar.gz2、 安装(检查安装环境生存makefile)./configure3、生产.o和可执行文件make原创 2021-11-12 14:56:12 · 1300 阅读 · 0 评论 -
Linux c epoll使用
文章目录1、函数介绍2、使用3、socket常用函数出错处理封装1、函数介绍1.1、创建一颗树,返回值指向树的根节点#include <sys/epoll.h>int epoll_create(int size);参数: size 创建的红黑树的监听数据节点(数目最大有多大,从Linux 2.6.8开始,max_size参数将被忽略,但必须大于零。)返回值: 成功 指向新创建的红黑树的根节点fd 失败 -1 errno1.2、对树进行操作(增加,修改,原创 2021-11-11 12:32:22 · 1123 阅读 · 0 评论 -
Linux c 多路IO转接服务器(poll函数使用)
文章目录1、poll函数2、代码3、socket常用函数出错处理封装1、poll函数int poll(struct pollfd* fds,nfds_t nfds,int timeout);struct pollfd{ int fd; // 监听的文件描述符 short events; // 待监听文件描述符的对应事件 取值:POLLIN、POLLOUT、POLLERR short revents; // 传入时0,如果满足对应事件的话,返回非0:P原创 2021-11-11 00:16:06 · 1052 阅读 · 0 评论 -
Linux c 多路IO转接服务器(select函数使用)
文章目录1、select函数介绍2、select代码1、select函数介绍int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);参数: nfds 监听所有文件描述符中,最大文件描述符+1 readfds:读 文件描述符监听集合(这三个参数都是传入传出参数) writefds:写 文件描述符监听集合 e原创 2021-11-10 22:29:28 · 1274 阅读 · 0 评论 -
Linux c 多线程并发服务器
文章目录1、流程2、代码1、流程全局定义了一个结构体,成员为,客户端通信的文件描述符,和返回的客户端信息结构体主线程: 创建结构体数组(存文件描述符、客户端信息结构体) 1、socket创建套接字 2、bind绑定ip端口号 3、listen 设置最大连接数 4、accpet阻塞等待客户端连接 连接成功之后间:用于通信的文件描述符存到结构体中 5、创建子线程,并把对应的结构体数组传递过去 6、设置线程分离(自动回收)子线程: 1、read数据 2、将读到的数据转换成大写原创 2021-11-09 22:14:48 · 614 阅读 · 0 评论 -
linux c 多进程并发服务器
文章目录1、流程2、代码1、流程需求:将客户端发送过来的数据,转换成大写,并将大写回过去参考:Linux c socket套接字(看完测底明白六大函数使用)Linux c 通过信号回收N个子进程1、socket 创建监听套接字2、bind 绑定地址结构3、lisen 链接上限4、创建子进程 子进程: 4.1 关闭用于建立连接的文件描述符(使用不到) 4.2 读 4.3 将读到的内容改写成小写 4.4 写给客户端 4.5 循环此过程,当read读到的数据为0时原创 2021-11-08 21:56:13 · 478 阅读 · 0 评论 -
Linux 线程同步(互斥锁、读写锁、死锁、条件变量、信号量)
文章目录1、互斥锁(互斥量)2、读写锁3、死锁4、条件变量5、信号量1、互斥锁(互斥量)线程同步:多个线程同时访问共享数据时,让他有先后顺序,多个线程争抢锁,抢到锁的可以对共享数据进行操作,没有抢到的线程堵塞等待,等待操作的线程解锁操作函数pthread_mutex_t // 创建锁pthread_mutex_init // 初始化pthread_mutex_lock // 加锁pthread_mutex_unlock // 解锁pthread_mutex_destroy //原创 2021-11-07 21:54:35 · 246 阅读 · 0 评论 -
Linux c 线程分离(两种方法实现线程分离)
文章目录1、使用函数实现线程分离2、通过属性实现线程分离3、杀死线程函数1、使用函数实现线程分离// 创建线程int pthread_create(pthread_t &tid,const pthread_attr_t* attr,void*(*start_rountn)(void*),void* arg);参数: 参1:传出参数,新创建的线程id 参2:线程属性(一般NULL) 参3:子线程回调函数 参4:参3的参数返回值: 成功 0 失败原创 2021-11-07 14:59:00 · 1747 阅读 · 0 评论 -
Linux c 创建多个线程并回收(pthread_create、pthread_join、pthread_self、pthread_exit)
文章目录1、函数简介1、函数简介线程简介LWP:轻量级的进程,本质仍是进程(Linux 环境下)进程:独立地址空间、拥有PCB线程:有独立的PCB,但是没有独立的地址空间(和创建的进程共享地址空间)区别:在于是否共享地址空间,独(进程)、合(线程)Linux下: 线程:最小执行单位 进程:最小资源分配单位,可看成是只有一个线程的进程 # 线程共享资源:1、文件描述符表2、每种信号的处理方式3、当前工作目录4、用户ID和组ID5、内存地址空间(.text/.d原创 2021-11-07 14:40:04 · 468 阅读 · 0 评论 -
Linux c 守护进程编写
文章目录1、守护进程1、守护进程Daemon(精灵)进程是linux后台服务进程,通常独立于控制终端,并且周期性地执行某种任务或等待处理运行着,他们都是守护进程1、创建子进程,父进程退出,所有工作在子进程中进行形式上脱离了控制终端2、在子进程中创建新会话: setsid函数 使自己完全独立出来,脱离控制3、改变当前目录为根目录: chdir函数 防止占用可卸载的文件系统4、重设文件权限掩码: umask函数 防止继承地文件创建屏蔽字拒绝某些权限 增加守护进程灵活性5、关闭文件原创 2021-11-06 18:22:53 · 287 阅读 · 0 评论 -
Linux c 通过信号回收N个子进程
文章目录1、信号集函数操作2、回收多个子进程1、信号集函数操作信号屏蔽字:将某些信号加入集合,对他们设置屏蔽,当屏蔽x信号后,在收到该信号,该信号的处理将推后(解除屏蔽后)未决信号集(用来记录信号处理转态)1、信号产生,未决信号集中描述该信号的位立即翻转为1,表信号处于未决状态,当信号被处理对应位翻转回为0,这一时刻往往非常短暂2、信号产生后由于某些原因(主要是阻塞)不能抵达,这类信号的集合称之为未决信号集,在屏蔽解除前,信号一直处于未决转态默认处理动作:当按下ctrl+c就会产生一个2原创 2021-11-06 14:53:20 · 254 阅读 · 0 评论 -
Linux c 信号操作(alram,setitimer,signal,sigaction函数使用)
文章目录1、信号基础概念2、计时函数使用1、信号基础概念信号共性: 简单、不能携带大量信息,满足条件才发送信号特质: 信号是软件层面上的”中断“,一旦信号产生,无论程序执行到什么位置,必须立即停止运行,处理结束,在继续执行后续指令# 所有信号的产生和发送都是内核来处理的递达:成功由内核产生,并且成功发送到指定进程未决:处于发送和递达之间的状态(主要由于阻塞屏蔽导致该转态)信号屏蔽字: 将某些信号加入集合,对他们设置屏蔽,当屏蔽x信号后,在收到该信号,该信号的处理将推后原创 2021-11-06 14:04:25 · 673 阅读 · 0 评论 -
Linux c 进程间通信(管道)
文章目录1、pipe函数实现有血缘关系进程通信2、mkfifo函数实现无血缘关系进程通信1、pipe函数实现有血缘关系进程通信管道原理:内核使用环形机制,借助缓冲区实现不可重复读取,数据填满就会覆盖不可自己读自己写双向半双工数据只能单向流通pipe函数介绍int pipe(int pipefd[2]);参数: fd[0]: 读端 fd[1]: 写端返回值: 成功 0 失败 -1通过管道实现父子进程通信#include <unistd.h&g原创 2021-11-05 16:22:40 · 260 阅读 · 0 评论 -
c语言 递归遍历目录(stat,opendir,readdir,closedir)
文章目录1、 使用函数介绍2、代码实现1、 使用函数介绍int lstat(cosnt char* path,struct stat* buf);参数: path 名字 buf 查询到的文件属性 返回值: 成功 0 失败 -1 DIR* opendir(cosnt char* name);参数: name 目录名返回值: 成功:返回指向目录结构体指针, 失败:NULLint closedir(DIR* dirp);参数: d原创 2021-11-04 18:42:48 · 1869 阅读 · 0 评论 -
c++ 类型转换(static_cast、dynamic_cast、const_cast)
文章目录1、static_cast2、dynamic_cast3、const_cast4、reinterpret_cast 强类型转换(任何类型)1、static_cast支持基础类型和具有基础关系 之间的转换int a = 65; // static_cast<转换之后的类型>(需要转的);char c = static_cast<char>(a);cout<<c<<endl;2、dynamic_cast具有继承关系的,在转换前会类原创 2021-11-03 11:54:15 · 80 阅读 · 0 评论 -
c++ STL常用容器使用(vector、deque、stack、queue、list、set、map等)
文章目录1、vector 使用2、deque 双向数组3、stack、queue(栈,队列)4、list 链表~1、vector 使用动态数组,也叫可变数组,容器的空间是动态增长的,当空间不足时,申请更大一块空间,让后将原数据拷贝到新空间中,并释放原空间1.1、初始化操作 int arr[] = {1,3,2,5}; // 1、方式一(初始化) vector<int> v1; // 容器尾部插入数据 v1.push_back(1);原创 2021-11-03 00:39:51 · 807 阅读 · 0 评论 -
c标准库文件IO函数
文章目录1、c库函数1、c库函数1、文件打开函数FILE* fopen(const char* pathname,const char* mode);参数: pathname:路径名字 mode:打开方式返回值: 成功:文件指针 失败:NULL2、文件关闭int fclose(FILE* stream);参数: stream 文件指针返回值: 成功:0 失败:-13、文件偏移int fseek(FILE* stream,long offset,int whence)原创 2021-11-01 13:59:14 · 285 阅读 · 0 评论 -
c++ 链表和类配合使用
文章目录Goods类,用于存放每件货物重量,total_weight用来存储全部重量 ,通过三个函数实现,对链表的增删遍历#include <iostream>using namespace std;class Goods{public: Goods() { m_weight = 0; m_next = NULL; } Goods(int weight) { this->m_weig原创 2021-10-31 13:46:32 · 298 阅读 · 0 评论