- 博客(48)
- 收藏
- 关注
转载 【无标题】
修改OSM的源码,再固定瓦片命名规则的基础上,增加主流的文件命名规则。以Arcgis地图为例,在本地是以的方式存放,其中z代表层级,x代表x轴瓦片编号,y代表瓦片编号。找到源码里面关于读取离线地图的代码,然后修改其加载我们自定义规则的瓦片数据。设计其加载规则首先是官方规则,如果没有找到文件,那么在加载我们的自定义规则。第一层:瓦片根路径;第二层:地图类型(street, satellite, cycle, transit, night-transit, terrain, hiking);
2024-03-28 15:11:02
104
转载 【无标题】
当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连接。
2022-10-18 19:52:20
186
转载 连接一个 IP 不存在的主机时,握手过程是怎样的?
连一个 IP 不存在的主机时如果IP在局域网内,会发送N次ARP请求获得目的主机的MAC地址,同时不能发出TCP握手消息。如果IP在局域网外,会将消息通过路由器发出,但因为最终找不到目的地,触发TCP重试流程。连IP 地址存在但端口号不存在的主机时不管目的IP是回环地址还是局域网内外的IP地址,目的主机的传输层都会在收到握手消息后,发现端口不正确,发出RST消息断开连接。当然如果目的机器设置了防火墙策略,限制他人将消息发到不对外暴露的端口,那么这种情况,发送端就会不断重试第一次握手。
2022-10-18 19:30:15
350
转载 Windows上如何玩非阻塞的connect?---让程序员自定义connect函数的超时时间
我们知道, 对于阻塞的socket而言, connect函数也是阻塞的, 我在Windows上测试过, 对于阻塞的socket而言, connect的阻塞时间约为25s(linux上是75s吧, 各个平台都不一样). 也就是说, 很多时候, 客户端需要等25s才继续往下执行。
2022-10-18 19:24:05
673
转载 GDB调试多文件的工程
版权声明:本文为CSDN博主「jianzhibeihang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/jianzhibeihang/article/details/5590461————————————————以前用GDB调试都只是调试单个的文件,在做DHCP二级relay的时候需要对整个工程进行gdb调试,发现自己竟然不会!现在终于恶补上了,发到博客上与大家分享。下面就以我调试ISC DHCP代码为例来说
2021-11-25 11:18:32
1486
转载 怎么在C++项目中使用redis
本文转载于:https://www.yisu.com/zixun/193487.html今天就跟大家聊聊有关怎么在C++项目中使用redis,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C++使用redis的实例详解hiredis是redis数据库的C接口,目前只能在linux下使用,几个基本的函数就可以操作redis数据库了。函数原型:redisContext *redisConnect(const char *ip, int port);
2021-11-16 21:55:34
4814
转载 反向代理服务器的工作原理
本文转载于:https://www.cnblogs.com/loverwangshan/p/9927968.html整个网络请求的大概流程图如下:我们有讲过 客户端缓存 和DNS缓存,那我们今天主要讲反向代理。一、什么是反向代理反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。通常的代理服务器,只用于代理内部网络对
2021-11-08 11:42:10
1577
转载 记一次Navicat for MySQL 10060错误的解决过程
本文转载于:https://www.cnblogs.com/wenbinjiang/p/12511116.html最近加班挺多,所以也好久没远程访问自己云服务器上的MySQL数据库了。今天本地启动Node服务时连不上MySQL,照常用Navicat For MySQL连接远程数据库进行检查,结果发现突然报错了。2003-Can’t connect to MySQL server on ‘XXX.XX.XX.XX’(10060)检查网络第一反应还是检查网络是不是正常,所以就马上ping测试一下,然而
2021-11-06 21:39:10
309
转载 Linux安装redis,启动配置不生效(指定启动加载配置文件)
本文转载于:https://www.cnblogs.com/piwefei/p/9298895.html一、今天有个同学问我,为什么明明安装了redis,修改了配置,启动的时候,配置还是不生效。如下图是安装后的redis文件图。二、想加载上图中的redis.conf,进入到src中寻找到启动文件redis-server三、启动时指定加载的配置文件四、如上图所示,加载的配置文件,你修改的信息均会生效。...
2021-11-05 11:14:13
1063
转载 状态服务器与无状态服务器(要点)
本文转载于:https://www.cnblogs.com/xingzc/p/6395891.html对于服务器程序来说,有个基本假设,即服务器是基于状态请求,还是基于无状态请求。根据这个假设,可以将服务器划分为状态服务器和无状态服务器。状态服务器如果是状态化请求,那么服务端一般需要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。状态服务器具有以下特点:保存客户请求的数据(状态)服务端容易对客户状态进行管理服务端并不要求每次客户请求都携带额外的状态数据无状态服务器无状态服务器
2021-10-27 17:10:19
643
转载 Linux进程与线程的区别
本文转载于:https://my.oschina.net/cnyinlinux/blog/422207本文较长,耐心阅读,必有收获!进程与线程的区别,早已经成为了经典问题。自线程概念诞生起,关于这个问题的讨论就没有停止过。无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了。一般程序员而言,搞清楚二者的概念,在工作实际中去运用成为了焦点。而资深工程师则在考虑系统层面如何实现两种技术及其各自的性能和实现代价。以至于到今天,Linux内核还在持续更新完善(关于进程和线程的实现模块也是内
2021-10-27 07:59:58
1315
原创 进程池代码记录
注:本代码来源于《Linux高性能服务器编程》一书一、头文件processpool.h// filename: processpool.h#ifndef PROCESSPOOL_H#define PROCESSPOOL_H#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <cassert&
2021-10-27 07:44:55
224
1
原创 用于同步进程的信号量代码示例
注:本文章代码示例以及知识点来自《Linux高性能服务器编程》一书,对应章节13.5——信号量。一、父、子进程间使用一个IPC_PRIVATE信号量来同步Linux信号量的API都定义在sys/sem.h头文件中,主要包含3个系统调用:semget、semop、semctl。它们都被设计为操作一组信号量,即信号量集,而不是单个信号。可以结合对比线程同步中的互斥锁来进行学习。#include <sys/sem.h>#include <cstdio>#include <
2021-10-22 09:49:36
351
原创 使用共享内存和共享内存映射区实现的聊天室服务器程序
一、关于代码中一些知识点的杂记1、mmap函数利用其MAP_ANONYMOUS标志可以实现父子进程之间匿名内存共享。通过打开一个文件,mmap也可以实现无关进程之间的内存共享。此处的服务器中提供了另外一种利用mmap在无关进程之间共享内存的一种方式,即先使用shm_open函数来创建或者打开一个POSIX共享内存对象,此POSIX共享内存对象的实现是通过tmpfs这个文件系统来实现的,tmpfs文件系的目录为/dev/shm,/dev/shm是驻留在内存 RAM 当中的,因此读写速度与读写内存速度一样,/
2021-10-19 19:08:59
663
原创 记录关于libevent安装错误:configure: error: openssl is a must but can not be found. You should add the direct
1、安装是按照如下步骤进行的:(安装步骤来源:CSDN博主「东山富哥」原文链接:https://blog.csdn.net/u014636209/article/details/82141729)1.下载下载地址:http://libevent.org/2.解压文件[root@localhost opt]# tar -zxvf libevent-2.1.8-stable.tar.gz3.创建lib文件夹/usr/lib/libevent4.配置[root@localhost lib
2021-10-14 22:21:54
5875
3
原创 计算机网络笔记—路由器是如何转发数据报的
一、路由器收到待转发的数据包时会做什么?当路由器收到一个待转发的数据报,在从路由表得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交数据链路层的网络接口软件。网络接口软件负责把下一跳路由器的IP地址转换成硬件地址(必须使用ARP),并将此硬件地址放在链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。二、路由器的分组转发算法路由器的分组转发算法如下:从IP数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。若N就是与此路由器直接相连的某个网络地址,则进行直接交
2021-09-14 21:57:57
5527
原创 计算机网络笔记—ARP协议(Address Resolution Protocol 地址解析协议)
一、ARP协议的作用ARP协议的作用简单来说就是解决主机或路由器如何获取MAC帧首部中需要填写的MAC地址的,即是为了从网络层中使用的IP地址,解析出在数据链路层中需要用到的硬件地址。由于是IP协议使用了ARP协议,因此通常就把ARP协议划归网络层。二、网络中主机增减时IP地址和硬件地址的映射关系更新网络层中使用的是IP地址,但是在实际的网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但是在一个网络中的IP地址和硬件地址的映射关系并非是固定不变的,因此需要ARP协议来解决映射关系动态更新的
2021-09-13 21:17:22
797
原创 关于shell创建目录的脚本程序
#! /bin/bashis_directory(){ DIR_NAME=$1 if [ ! -d $DIR_NAME ]; then return 1 else return 0 fi }for DIR in "$@"; do if is_directory "$DIR" then : else echo "$DIR doesn't exist. Creating it now..
2021-09-12 21:00:37
2033
转载 深入浅出TCP/IP协议栈
本文转载于:https://www.cnblogs.com/onepixel/p/7092302.htmlTCP/IP 协议栈是一系列协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用四层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事不用我们操心;其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP 的工作原理,通俗一点讲
2021-09-10 16:50:29
287
转载 setsockopt用法详解
本文转载于:https://www.cnblogs.com/baiduboy/p/8127913.html最近做的一个程序用到了IOCP通信模型,里面用到了setsockopt对套接字进行设置,看源代码的时候最setsockopt函数很不理解,看了msdn以后还是不太明白这个函数的用法,于是就到网上找了一个这个函数的用法,找到了下面的这篇文章,我觉得对setsockopt这个函数讲解的特别号,就转过来了,方便以后的查阅。。1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继
2021-08-13 10:27:39
3255
原创 shell中case结构的使用
#! /bin/bashecho "Is it morning? Please answer yes or no"read YES_OR_NO case "$YES_OR_NO" in yes|y|Yes|YES|Y) echo "Good morning";; [nN]*) echo "Good afternoon";; *) echo "Sorry, $YES_OR_NO not recognized.Enter ye
2021-07-31 18:34:56
166
原创 shell通过参数创建目录的代码
#! /bin/bashis_directory(){ DIR_NAME=$1 if [ ! -d $DIR_NAME ]; then return 1 else return 0 fi }for DIR in "$@"; do if is_directory "$DIR" then : else echo "$DIR doesn't exist. Creating it now..
2021-07-31 17:55:11
316
原创 关于shell脚本中函数内和函数外的参数$0、$1、$2...的对比
1、代码1#! /bin/bashecho $0echo $1echo $2echo $3foo(){ echo $0 echo $1 echo $2 echo $3 echo $4 echo "function foo\n"}echo "---start---"foo 11 22 33 44#foo $0 $1 $2 $3 $4echo "---end---"2、运行结果13、代码2#! /bin/bashech
2021-07-31 16:58:51
2449
4
原创 Linux递归实现目录遍历
代码1:#include <cstdio> #include <sys/stat.h> #include <dirent.h> #include <cstdlib>
2021-07-30 17:53:36
395
原创 关于本地套接字的使用
简述:本地套接字的使用与网络套接字的使用大体上是类似的,但是也存在一些区别,主要有(1)和套接字绑定的地址结构体不同,本地套接字使用的结构体是 struct sockaddr_un ,而网络套接字使用的是 struct sockaddr_in;(2)协议族不同,本地套接字使用的是AF_UNIX 或AF_LOCAL, 网络套接字常用的是AF_INET;(3)对于使用本地套接字的C/S模型,服务器和客户端都需要显式绑定套接字描述符和地址信息,即(1)中提到的存放地址信息的结构体;(4)用本地套接字的C/S模型
2021-07-30 11:44:32
470
原创 关于UDP的普通C/S模型、广播C/S模型以及组播C/S模型
简述:UDP与TCP一个主要的区别就是客户端与服务器之间不需要建立连接,即不经历三次握手过程。只需要主动发送数据的一方确定接收数据的一方的地址信息(IP地址+端口号),可以这么理解,数据的接收方要先确定自己用于接收数据的本地地址信息,即要显示绑定。作为接收数据的一方可以在接收数据的过程中获知对方的地址信息,然后通过获得的地址信息,向对方发送数据。一、普通C/S模型1、说明在普通的C/S模型中,客户端一般作为发起数据传输的主动方,即客户端会先发送数据,故客户端在发送数据前要先确定服务器的IP地址(这个
2021-07-29 16:56:28
319
原创 epoll 边沿触发的非阻塞连接读取数据代码记录
1 #include <cstdio> 2 #include <cstdlib> 3 #include <unistd.h> 4 #include <sys/socket.h> 5 #include <arpa/inet.h> 6 #include <sys/epoll.h> 7 #include <fcntl.h> 8 #include "wrap.h" 9 10 #define M..
2021-07-28 15:47:05
178
转载 (转载)epoll 反应堆模型代码
代码转载自:https://www.cnblogs.com/wanghao-boke/p/11443231.html 1 #include <cstdio> 2 #include <cstdlib> 3 #include <sys/epoll.h> 4 #include <sys/socket.h> 5 #include <arpa/inet.h> 6 #include <fcntl.h> 7 #includ
2021-07-28 15:34:24
142
原创 线程池代码记录
1、线程池思想线程池最主要的思想就是为了减少由于对资源的动态分配而引起的系统调用产生的耗时,即不在客户端需要连接时再创建线程,而是提前创建好一定数量的线程,等待对客户端连接的任务的处理,同时,线程的数量也并非是固定不变的,而是根据任务队列中任务的数量、现存线程数量以及处于繁忙状态线程数量等,来对线程的数量进行动态管理,适时增加或减少线程池中线程的数量。对任务的处理过程中用到了生产者与消费者模型,即有一个公共的任务队列区域,客户端生产任务,服务器负责把任务放到任务队列中,线程池中的线程则从任务队列中获取任
2021-07-28 10:15:00
155
原创 关于常用的I/O复用模型中epoll的使用代码记录
epoll使用的基本方法的代码: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <unistd.h> 4 #include <cstring> 5 #include <arpa/inet.h> 6 #include <sys/epoll.h> 7 #include <errno.h> 8 #include <cctype>
2021-07-25 19:35:26
83
原创 关于常用的I/O复用模型中select函数和poll函数的使用代码记录对比
1、select函数的使用 1 #include <cstdio> 2 #include <cstdlib> 3 #include <unistd.h> 4 #include <cstring> 5 #include <sys/socket.h> 6 #include <arpa/inet.h> 7 #include <cctype> 8 #include "wrap.h" 9 10
2021-07-25 15:42:56
80
原创 借助信号量完成生产者消费者模型
1、本程序主要为了展示通过信号量来实现生产者与消费者模型,为了体现代码的逻辑性,代码中主要有各功能实现函数,省略错误判断处理函数等代码。2、代码: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #inclu
2021-07-21 12:10:09
76
原创 借助条件变量完成生产者消费者模型
1、此代码为借助条件变量结合互斥锁完成生产者与消费者模型,代码中主要关注锁和条件变量的定义、初始化、使用(加锁、解锁)以及释放(销毁)。2、代码: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <unistd.h> 5 #include <pthread.h> 6 7 void err_thread(int ret,
2021-07-20 18:29:38
100
原创 通过信号非阻塞地回收子进程代码
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <unistd.h> 5 #include <pthread.h> 6 #include <signal.h> 7 #include <sys/wait.h> 8 9 #define CHLDNUM 10 10 int chldnum = CH.
2021-07-18 19:33:43
252
原创 关于循环创建子进程分析
1、父进程创建子进程知识点下面内容引用自博文:https://blog.csdn.net/xy010902100449/article/details/44851453同时建议参考:深入理解计算机系统(CSAPP)第八章异常控制流相关内容。“fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理
2021-07-16 07:41:39
652
2
转载 对红黑树的认识总结
版权声明:本文为CSDN博主「张彦峰ZYF」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/106080394 目录 一、对红黑树的基本理解 (一)对红黑树的基本定义理解 (二)对红黑树是“近似平衡”的理解 1.将红色节点从红黑树中去掉,分析包含黑色节点
2021-05-24 12:23:16
52
原创 数据结构及算法——归并排序
一、归并排序的思想其原理是假设初始序列含有n个记录,则可以将n个记录看成是n个有序的子序列,每个子序列长度为1,然后两两进行归并,得到[n/2](即不小于n/2的最小整数)个长度为2或者1(当序列的元素为奇数个时最后可能存在一个单独的子序列)的有序子序列;再进行两两归并,如此重复,直到得到一个长度为n的有序序列为止,此排序方法称作为2路归并排序。二、归并排序代码(来源于大话数据结构)#include <iostream>#include <initializer_list>
2021-05-23 22:20:01
202
原创 数据结构及算法——快速排序
一、关于快速排序的思想快速排序是一种分治的思想,它通过一趟排序将待排序记录分割成独立的两个部分,其中的一部分关键字均比另一部分的关键字小,再分别对这两部分记录继续进行排序,以便达到整个序列有序的目的。二、快速排序的代码(来源于大话数据结构)#include <iostream>#include <initializer_list>#define MAXSIZE 10000#define TRUE 1#define FALSE 0#define MAX_LENGTH_I
2021-05-22 22:36:49
203
原创 关于二叉树深度递归图助理解
递归三要素:1、函数的功能;2、递归结束条件;3、函数等价关系式。这些相关的文章上已经讲了很多了,这里不做过多的文字描述,仅仅以最简单的左斜二叉树的深度递归求解作为例子,以图示的方式表示辅助理解递归在做什么。图中每个方块代表每次递归函数调用,红色部分代表未执行部分,即因为函数已经在该未执行部分前面退出,回到调用该函数的上级函数中,方块上的数字表示函数的返回值。...
2021-05-10 16:05:37
196
原创 C++ Primer 第十五章知识点 15.5—访问控制与继承
一、每个类分别控制着其成员对于派生类来说是否可访问:1、受保护成员受保护成员对于类的用户来说是不可访问的;受保护成员对于派生类的成员和友元来说是可访问的;派生类的成员和友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问权限。示例代码:class Base{protected: int prot_mem;};class Sneaky: public Base{ friend void clobber(Sneaky&
2021-05-06 07:28:10
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人