C++
mojolang
精品驿站
展开
-
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。学过TCP/IP的同学应该都知道,传输层的两个主要协议是UDP和TCP,其中UDP是无连接的、面向packet的,而TCP协议是有连接、面向流的协议。所以非常容易理解,使用UDP协议的转载 2017-07-14 18:34:22 · 773 阅读 · 0 评论 -
boost::tuple 深入学习讲解
Boost.Tuple 库提供了一个更一般的版本的 std::pair —— boost::tuple 。 不过 std::pair 只能储存两个值而已, boost::tuple 则给了我们更多的选择。原创 2014-05-03 02:29:24 · 4363 阅读 · 1 评论 -
boost::tie()和boost::variant()讲解
boost::tie()和boost::variant()讲解原创 2014-05-04 00:22:55 · 5081 阅读 · 0 评论 -
C++ Linux 多线程之创建、管理线程
在这个库最重要的一个类就是 boost::thread,它是在 boost/thread.hpp 里定义的,用来创建一个新线程。原创 2014-05-05 07:18:52 · 3160 阅读 · 0 评论 -
Unix C++(boost) 线程同步和线程组
虽然多线程的使用可以提高应用程序的性能,但也增加了复杂性。 如果使用线程在同一时间执行几个函数,访问共享资源时必须相应地同步。 一旦应用达到了一定规模,这涉及相当一些工作。 所以要学习Boost.Thread提供同步线程的类。原创 2014-05-06 05:15:37 · 2279 阅读 · 1 评论 -
boost事件处理
很多开发者在听到术语'事件处理'时就会想到GUI:点击一下某个按钮,相关联的功能就会被执行。 点击本身就是事件,而功能就是相对应的事件处理器。这一模式的使用当然不仅限于GUI。 一般情况下,任意对象都可以调用基于特定事件的专门函数。 本章所介绍的 Boost.Signals 库提供了一个简单的方法在 C++ 中应用这一模式。严格来说,Boost.Function 库也可以用于事件处理。 不过,Boost.Function 和 Boost.Signals 之间的一个主要区别在于,Boost.Signa原创 2014-05-14 05:26:17 · 3019 阅读 · 1 评论 -
Linux下的signal信号机制
在Linux中,要发送一个信号相当容易。程序员需要知道两个信息:要发送哪个信号,将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用的信号的列表。用户可以只将信号发送给用户自己的进程,也可以以root身份运行从而将信号发送给任意一进程。 #include #include #include #include void when_alarm();转载 2015-08-03 06:08:47 · 819 阅读 · 0 评论 -
关于C++ const 的全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示:No.作用说明参考代码转载 2015-08-02 22:30:35 · 445 阅读 · 0 评论 -
MOSH:USE PROTOBUF’S GZIP
日課と化してるgit pull後のmakeでエラー…transportfragment.cc:20:44: error: google/protobuf/io/gzip_stream.h: No such file or directory+#include [Use protobuf’s Gzip{Input,Output}Stream wrapper aroun转载 2015-04-19 10:30:07 · 1300 阅读 · 0 评论 -
GetMemory讲解
错误程序:void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( “%s”,str );} 这个一个转载 2015-03-18 17:00:33 · 744 阅读 · 0 评论 -
Linux C++ Boost::any深入理解
/* * any_test.cpp * * Created on: 2014年5月2日 * Author: *** */#include#include#includeusing namespace std;using boost::any_cast;typedef std::list many;void append_i原创 2014-05-01 19:16:47 · 1365 阅读 · 0 评论 -
C++11 新特性:Lambda 表达式
或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个。这个全新的特性听起来很深奥,但却是很多其他语言早已提供(比如 C#)或者即将提供(比如 Java)的。简而言之,Lambda 表达式就是用于创建匿名函数的。GCC 4.5.x 和 Microsoft Visual Studio 早已提供了对 lambda 表达式的支持。在 GCC 4.7 中,默认是不开启 C++ 11转载 2017-01-02 23:48:41 · 457 阅读 · 0 评论 -
Lambda函数(C++11起)
构造一个闭包:能在作用域内捕获变量一个的匿名函数对象。语法 [ capture ] ( params ) mutable exception attribute -> ret { body }(1) [ capture ] ( params ) -> ret { body }(2)转载 2017-01-03 00:55:16 · 609 阅读 · 0 评论 -
TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
1. TCP保活的必要性1) 很多防火墙等对于空闲socket自动关闭2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素如果网络正常, socket也通过close操作来进行优雅的关闭, 那么一切完美. 可是有很多情况, 比如网线故障, 客户端一侧突然断电或者崩溃等等, 这些情况server并不能转载 2017-07-14 18:31:38 · 780 阅读 · 0 评论 -
用MarioTCP库实现一个单机10亿级的百万并发长连接
注:如果用此服务器做变长data的传输,请在业务处理函数中为input buffer增加清空功能(一行memset搞定;也可以在mariotcp核心代码mario_network.c的read功能中增加,mariotcp为了追求性能极限没做此设置)。MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩。同时他可以是一个很简洁的Linux C 开发学习工程。毫不夸转载 2017-03-28 09:23:57 · 3116 阅读 · 0 评论 -
libevent和protobuf搭建 socket server
0. 基础代码 // 设置某fd为O_NONBLOCK模式 int set_non_block(int fd); // server端socket流程:socket(),setsockopt(),bind(),listen(),set_non_block(),返回server_fd int setup_tcp_server转载 2017-03-28 09:25:38 · 704 阅读 · 0 评论 -
使用Vs2015开发linux(centos7)程序
1.首先下载vs2015 with update32.然后下载Visual C++ for Linux Development(https://visualstudiogallery.msdn.microsoft.com/725025cf-7067-45c2-8d01-1e0fd359ae6e)Ps:另一篇文章介绍这个:(https://blogs.msdn.microso转载 2017-03-06 18:52:56 · 1526 阅读 · 3 评论 -
100万并发连接服务器
100万并发连接服务器笔记之准备篇前言测试一个非常简单服务器如何达到100万(1M=1024K连接)的并发连接,并且这些连接一旦连接上服务器,就不会断开,一直连着。 环境受限,没有服务器,刚开始都是在自己的DELL笔记本上测试,凭借16G内存,和优秀的vmware workstation虚拟机配合,另外还得外借别人虚拟机使用,最终还得搭上两台2G内存的台式机(安装cento转载 2017-03-09 17:20:29 · 10263 阅读 · 1 评论 -
Simple MySQL-C ORM - 简化C语言访问MySQL
当你需要在纯C语言的应用程序中访问 MySQL 表中的数据时,是非常繁琐的事情,而该框架可以帮你大量的简化编码的工作,该框架采用 Python 开发,适用于 C 语言程序。示例代码#include #include #include #include int main (int argc, char **argv){ int ret; MYSQL global_mysql转载 2017-01-24 02:23:04 · 1098 阅读 · 0 评论 -
C++ 程序员快过来围观:非常实用全面的 C++ 资源
C++ 程序员快过来围观:非常实用全面的 C++ 资源 C++这次的资源涉及到了标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等,C++程序员学习必备!Jasonfrozen : C/C++的Jason解析生成器Jansson :进行编解码和处理Jason数据的C语言库jbson :C++14中构建和迭代BSON data,和J转载 2017-01-23 09:56:51 · 849 阅读 · 1 评论 -
C++操作Redis数据库
今天,Mayuyu来学习如何用C++来操作Redis数据库。通过hiredis.h接口来实现,目前只能在Linux环境使用。hiredis.h的下载地址为:https://github.com/redis/hiredis 主要包括如下四个方法 1. redisContext* redisConnect(const char *ip,转载 2016-12-27 15:17:18 · 4809 阅读 · 1 评论 -
Linux下C++操作Redis
介绍Redis的全称是Remote Dictonary Server(远程字典服务器),redis是由Salvatore Sanfilippo写的一个高性能key-value存储系统,Redis有如下优点:1. 高性能 - Redis能支持超过100K+每秒的读写频率2. 丰富的数据类型 - Redis支持Strings、Lists、Hashes、Sets及Ordered Sets转载 2016-12-27 15:09:29 · 545 阅读 · 0 评论 -
linux C gbk utf-8编码转换
最近从新浪开放IP接口上读取IP的归属地信息,结果faxia转载 2014-09-24 13:52:47 · 4093 阅读 · 2 评论 -
C/C++ / string 字符串去掉左右空格
以下代码摘抄CSDN论坛:源文连接在:http://topic.csdn.net/u/20110620/10/1e0e91f0-1440-45db-aa29-6ce618fec2da.html本人目的只在于收藏;C方法:[cpp] view plaincopyvoid del_sp(char *src) // 删除C风格字符串中的空格转载 2014-09-22 17:06:53 · 6907 阅读 · 0 评论 -
数组指针和指针数组的区别
数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。原创 2014-06-27 02:58:52 · 1592 阅读 · 1 评论 -
C语言中printf格式化输出函数
int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h|l]type 规定数据输出方式,具体如下: 1.type 含义如下: d 有符号10进制整数 i 有符号10进制整数 o 有符号8进制整数 u 无符号10进制整数转载 2014-04-27 03:55:36 · 1410 阅读 · 0 评论 -
linux 进程大全
进程创建——父子进程fork()用来创建进程fork(void)在linux中所有进程都是由init进程直接或间接创建成功:在父进程中将返回子进程的PID;子进程返回0,以区别父进程失败:父进程中返回-1 1 #include 2 #include 3 #include 4 5 int main(int argc,char *argv[])转载 2014-04-27 22:50:43 · 610 阅读 · 0 评论 -
C++ STL equal_range的用法
equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,原创 2014-04-05 14:47:23 · 7586 阅读 · 0 评论 -
C++ STL merge,set_union,set_intersection,set_difference,set_symmetric_difference
#include "algostuff.hpp"#include #include using namespace std;int main(){int array_1[] = {1,2,2,4,6,7,7,9};int array_1_count = sizeof(array_1)/sizeof(int);int array_2[] = {2,原创 2014-04-05 17:40:53 · 1419 阅读 · 0 评论 -
【算法-排序之一】冒泡排序
算法-排序之冒泡排序 如果数据按照一定的顺序进行排序,数据处理的效率将显著的提高。算法是编程的精髓,一个高效而合适的算法能极大的减少时间消耗与空间消耗,提到“合适”是因为没有哪个算法可以在所有情况下都表现出色,同样是排序,在不同数据规模下各种排序算法有不同的效能表现,选择合适的解决算法的才能最大限度地提高效率。 1.冒泡算法B转载 2014-04-27 22:35:15 · 717 阅读 · 0 评论 -
一个“蝇量级” C 语言协程库
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法“子例程是协程的特例”,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像转载 2014-04-13 21:39:54 · 1252 阅读 · 0 评论 -
在 Linux 上实现基于 Socket 的多进程实时通信
套接口(Socket)为目前Linux上最为广泛使用的一种的进程间通信机制,与其他的Linux通信机制不同之处在于除了它可用于单机内的进程间通信以外,还可用于不同机器之间的进程间通信。但是由于Socket本身不支持同时等待和超时处理,所以它不能直接用来多进程之间的相互实时通信。本文提出一个基于Socket的多进程之间通信的实现方法。原理是建立一个进程专门用来做为通信服务器(server)来转载 2014-04-17 10:54:36 · 1175 阅读 · 0 评论 -
C++ STL Rotating
#include "algostuff.hpp"#include #include using namespace std;int main(){set coll;INSERT_ELEMENTS(coll,1,9);PRINT_ELEMENTS(coll);coutset::iterator pos = coll.begin();advanc原创 2014-04-01 22:43:34 · 896 阅读 · 0 评论 -
void f(int(&p)[3]){} 和void f(int(*p)[3]){}的区别
#includeusing namespace std;void f(int(&p)[3]){ cout cout}int main(){ int a1[3]={1,2,3}; cout cout f(a1);}编译后输出:原创 2014-05-02 03:01:42 · 2611 阅读 · 0 评论 -
C++输出格式控制
setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6,所以不管数据是多少,都只输出六位。如果setprecision(n)与setiosflags(ios::fixed)或者setiosflags(ios_base::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。 如果与setiosn转载 2014-04-27 03:56:44 · 1069 阅读 · 0 评论 -
C++开源跨平台类库及在VC++.net中应用的配置
在如下的库支持下,开发的系统可以很方便移植到当前大部分平台上运行而无需改动,只需在对应的平台下 用你喜欢的编译器重新编译即可。经典的C++库: STLport-------SGI STL库的跨平台可移植版本,在以前有些编译器离符合标准比较远的情况下 那时还是有用的,当然目前vc71已经比较接近标准了,故目前不怎么用它了。 Boost---------准标准库, 功能强大 涉转载 2014-05-06 14:14:16 · 1011 阅读 · 0 评论 -
C++ STL Merge的用法
merge函数的作用是:将两个有序的序列合并为一个有序的序列。函数参数:merge(first1,last1,first2,last2,result,compare);//firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,last2为容器的末迭代器,result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)原创 2014-04-05 15:12:32 · 20051 阅读 · 0 评论 -
linux下c程序 daemon、fork与创建pthread的顺序问题
linux下c程序 daemon、fork与创建pthread的顺序问题原创 2014-06-25 10:18:58 · 2705 阅读 · 0 评论 -
C++ STL priority_queue
priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素,但是默认排序准则为yuansh)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是以别的容器原创 2014-04-11 01:06:24 · 1018 阅读 · 0 评论 -
C++ STL bitset 用法整理
std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位。下面看一个例子:#includestd::bitset bs;//它是一个模板,传递的参数告诉编译器bs有8个位。我们接着看上面的代码,通过上面两行的代码我们得到转载 2014-04-11 02:14:59 · 18843 阅读 · 1 评论