自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 资源 (1)
  • 收藏
  • 关注

原创 Linux下文件描述符剖析

了解莱茨狗 2018年1 月 12 日,百度正式上线了区块链开放平台“BaaS”后,百度金融区块链实验室日前又推出了区块链宠物莱茨狗。 通俗的来讲莱茨狗是百度基于区块链技术实现的一个大家养狗的游戏,当然这狗是虚拟的,说白了你就是收藏一些狗狗的照片。 2018年2月04日才正式推出,但是百度并不是第一家做这种游戏的公司,2017 年 12 月初,基于以太坊平台的应用 CryptoKitti...

2018-03-06 15:55:11 3510 1

原创 通用Makefile,自动查找源文件

objs=$(patsubst %.c, %.o, $(wildcard *.c)) #将所有的*.c文件替换成*.o, .o可以作为目标文件.target=app   #目标应用程序变量名CC=gcc        #编译工具链指定CPPFLAGS=-Iinclude  #预编译标致-I -D等CFLAGS=-g -Wall     #编译标致 -g -Wall -fpic -O1等L...

2018-03-18 10:04:55 2603 1

原创 ZeroMQ学习 (十)ROUTER-DEALER

ROUTER-DEALER​ ZMQ_ROUTER类型的套接字是请求/回复模式的一种升级。​ 当ZMQ_ROUTER收到一个消息的时候,会自动在消息前面添加一帧,这一帧用来识别发送端的地址。​ 当发送一个消息的时候,需要先发送一帧对端的地址,然后再发送消息,如果目的地址指向的对端不存在了,这个消息就会被丢弃。​ 对端的地址默认情况下由ZMQ来产生一个唯一标识UUID。​ ​ ROUTER源码://...

2018-03-04 11:27:41 4731 1

原创 ZeroMQ学习 (九)zmq_poll使用

11 zmq_poll使用​ 每一个zmq的套接字也可以认为是一路IO,那么在多路IO读写的时候,我们可以使用zmq_poll进行IO复用,使用了zmq_poll()函数,当收到了消息的第一帧时,其它帧其实也已经收到了。订阅者代码如下:​#include <zmq.h>#include <stdio.h>#include <unistd.h>#inclu...

2018-03-04 11:26:36 6583 1

原创 ZeroMQ学习 (八)PAIR-PAIR

10 PAIR-PAIR​ 线程间通信的时候,最好使用,PAIR-PAIR模式进行通信。你可以让信号发送方使用PUSH,接收方使用PULL,这看上去可能可以,但是需要注意的是,PUSH套接字发送消息时会进行负载均衡,如果你不小心开启了两个接收方,就会“丢失”一半的信号。而PAIR套接字建立的是一对一的连接,具有排他性。可以让发送方使用DEALER,接收方使用ROUTER。但是,ROUTER套接字会...

2018-03-04 11:25:48 3424

原创 ZeroMQ学习 (七) 多帧消息

9 多帧消息​ ZMQ消息可以包含多个帧,这在实际应用中非常常见.​ 多帧消息的每一帧都是一个zmq_msg结构,也就是说,当你在收发含有五个帧的消息时,你需要处理五个zmq_msg结构。你可以将这些帧放入一个数据结构中,或者直接一个个地处理它们。下面的代码演示如何发送多帧消息:zmq_msg_send (&message, socket, ZMQ_SNDMORE);...zmq_ms...

2018-03-04 11:25:05 2470

原创 ZeroMQ学习 (六) 信号中断的处理

8 信号中断的处理​ 现实环境中,当应用程序收到Ctrl-C或其他诸如ETERM的信号时需要能够正确地清理和退出。默认情况下,这一信号会杀掉进程,意味着尚未发送的消息就此丢失,文件不能被正确地关闭等。​ 在C语言中我们是这样处理消息的:interrupt: Handling Ctrl-C cleanly in C发布者代码://// Shows how to handle Ctrl-C//...

2018-03-04 11:24:23 1422

原创 ZeroMQ学习 (五)发布-订阅模式

7 发布-订阅模式​ 发布者不用管是否有订阅者,它只管不停的发布,也不用接受客户端的请求。多订阅者可以尝试链接发布者,来接受信息,但是不能往发布者发送请求。发布者源码:#include <zmq.h>#include <stdio.h>#include <unistd.h>#include <string.h>int main (void)...

2018-03-04 11:23:34 1527

原创 ZeroMQ学习 (四)请求-应答模式

6 请求-应答模式​ 请求-应答模式,REQ-REP必须同步的进行,即,REQ套接字必须先发送请求,然后等待应答;REP必须先接受请求,然后发送应答。一旦打乱这个顺序,将造成错误,套接字将无法继续工作。请求端源码request.cpp:​#include <zmq.h>#include <stdio.h>#include <unistd.h>#inclu...

2018-03-04 11:22:59 2150

原创 ZeroMQ学习 (三)核心消息模式

4 核心消息模式​ ZMQ会自动进行连接或重连;无论是发送消息还是接收消息,ZMQ都会先将消息放入队列中,并保证进程不会因为内存溢出而崩溃,适时地将消息写入磁盘;ZMQ会处理套接字异常;所有的I/O操作都在后台进行;ZMQ不会产生死锁。ZMQ的核心消息模式有:请求-应答模式 将一组服务端和一组客户端相连,用于远程过程调用或任务分发。发布-订阅模式 将一组发布者和一组订阅者相连,用于数据分发。管道模...

2018-03-04 11:22:00 1013

原创 ZeroMQ学习 (二) ZMQ与传统的TCP区别

3 ZMQ与传统的TCP区别​ 在连接两个节点时,其中一个需要使用zmq_bind(),另一个则使用zmq_connect()。通常来讲,使用zmq_bind()连接的节点称之为服务端,它有着一个较为固定的网络地址;使用zmq_connect()连接的节点称为客户端,其地址不固定。我们会有这样的说法:绑定套接字至端点;连接套接字至端点。端点指的是某个广为周知网络地址。​ ZMQ连接和传统的TCP连...

2018-03-04 11:21:07 6186

原创 ZeroMQ学习 (一)认识与安装

关于ZMQ1 简单介绍​ ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着...

2018-03-04 11:20:12 1610

原创 skynet框架应用 (十二) snax框架

12 snax框架​ snax 是一个方便 skynet 服务实现的简单框架。(简单是相对于 skynet 的 api 而言)​ 使用 snax 服务先要在 Config 中配置 snax 用于路径查找。每个 snax 服务都有一个用于启动服务的名字,推荐按 lua 的模块命名规则,但目前不推荐在服务名中包含"点" (在路径搜索上尚未支持 . 与 / 的替换)。在启动服务时会按查找路径搜索对应的文...

2018-03-04 11:11:17 5474 12

原创 skynet框架应用 (十八) http协议的服务

18 http协议的服务​ http协议的服务分为http服务端与http客户端,skynet服务作为http服务端的时候,可以像其他的web服务器一样,接收http请求并给与应答。skynet的服务作为http客户端的时候,可以通过http协议像远端发送请求并等待得到应答。18.1http服务端​ skynet 从 v0.5.0 开始提供了简单的 http 服务器的支持。skynet.httpd...

2018-03-04 11:07:56 9017 8

原创 skynet框架应用 (十七) protobuffer

17 protobuffer​ 假如我们要建立的skynet服务器与客户端的连接方式为长连接,且选择了Google的Protobuf来定制我们的网络协议,那么,接下来我们要解决的问题就是:如何在skynet框架中使用socket+protobuf。​ 由于protobuf的lua版本的支持存在着部分缺陷,为了避免踩坑,这里我们直接使用云风博客中推荐的pbc动态proto解析库。17.1 安装PBC...

2018-03-04 11:03:59 5021 9

原创 skynet框架应用 (十六) mysql

16 mysql​ skynet封装了mysql的驱动,主要文件为 lualib/skynet/db/mysql.lua。先在ubuntu下安装mysqlsudo apt-get install mysql-server设置mysql的用户密码为root 123456,并且创建一个skynet数据库。16.1 连接mysql连接mysql的APIlocal skynet = require "...

2018-03-04 11:03:02 6821 1

原创 skynet框架应用 (十五) msgserver

15 msgserver​ snax.msgserver 是一个基于消息请求和回应模式的网关服务器模板。它基于 snax.gateserver 定制,可以接收客户端发起的请求数据包,并给出对应的回应。​ 和 service/gate.lua 不同,用户在使用它的时候,一个用户的业务处理不基于连接。即,它不把连接建立作为用户登陆、不在连接断开时让用户登出。用户必须显式的登出系统,或是业务逻辑设计的超...

2018-03-04 11:02:01 5264 3

原创 skynet框架应用 (十四) 登录服务

14 登录服务​ 现在的网络游戏大部分是需要登录的,一般会有一个专门的登录服务来处理,登录服务要解决的问题:1、用户登录信息保密工作。2、实际登录点分配工作。14.1 加密算法14.1.1 DHexchange密钥交换算法​ DHexchange密钥交换算法主要用来协商一个服务器与客户端的密钥。云风已经帮我们封装好了这个加密方法,可以直接这么使用:package.cpath = "luaclib...

2018-03-04 10:58:55 12295 1

原创 skynet框架应用 (十三) 网关服务

13 网关服务​ skynet 提供了一个通用模板 lualib/snax/gateserver.lua 来启动一个网关服务器,通过 TCP 连接和客户端交换数据。​ TCP 基于数据流,但一般我们需要以带长度信息的数据包的结构来做数据交换。gateserver 做的就是这个工作,把数据流切割成包的形式转发到可以处理它的地址。local gateserver = require "snax.ga...

2018-03-04 10:45:23 8531 11

原创 skynet框架应用 (十一) 域名查询

11 域名查询​ 在 skynet 的底层,当使用域名而不是 ip 时,由于调用了系统 api getaddrinfo ,有可能阻塞住整个 socket 线程(不仅仅是阻塞当前服务,而是阻塞整个 skynet 节点的网络消息处理)。虽然大多数情况下,我们并不需要向外主动建立连接。但如果你使用了类似 httpc 这样的模块以域名形式向外请求时,一定要关注这个问题。​ skynet 暂时不打算在底层实...

2018-03-04 10:33:24 2498

原创 skynet框架应用 (十) socketChannel

10 socketChannel​ 在与外部服务交互式时,请求回应模式是最常用模式之一。通常的协议设计方式有两种。每个请求包对应一个回应包,由 TCP 协议保证时序。发起每个请求时带一个唯一 session 标识,在发送回应时,带上这个标识。这样设计可以不要求每个请求都一定要有回应,且不必遵循先提出的请求先回应的时序。​ 对于第一种模式,用 skynet 的 Socket API 很容...

2018-03-04 10:32:10 4585

原创 skynet框架应用 (九) socket网络服务

9 socket网络服务9.1 skynet.socket 常用api--这样就可以在你的服务中引入这组 api 。local socket = require "skynet.socket"​--建立一个 TCP 连接。返回一个数字 id 。socket.open(address, port)   ​--关闭一个连接,这个 API 有可能阻塞住执行流。因为如果有其它 corou...

2018-03-04 10:28:22 9975 4

原创 skynet框架应用 (八) Multicast组播

8 Multicast组播8.1 Multicast介绍local mc = require "skynet.multicast"​ 引入 multicast 模块后,你可以使用 skynet 的组播方案。你可以自由创建一个频道,并可以向其中投递任意消息。频道的订阅者可以收到投递的消息。​ 你可以通过 new 函数来创建一个频道对象。你可以创建一个新频道,也可以利用已知的频道 id 绑定一个已有频...

2018-03-03 21:01:37 4533 7

原创 skynet框架应用 (七) 本地服务间消息通信

7 服务间消息通信​ skynet中的每一个服务都有一个独立的lua虚拟机,逻辑上服务之间是相互隔离的,那么你就不能使用传统意义上的LUA全局变量来进行服务间通信了。​ 在skynet中服务之间可以通过skynet消息调度机制来完成通信。skynet中的服务是基于actor模型设计出来的,每个服务都可以接收消息,处理消息,发送应答消息。​ 每条 skynet 消息由 6 部分构成:消息类型、ses...

2018-03-03 20:59:19 11793 14

原创 skynet框架应用 (六) 服务调度

6 服务调度local skynet = require "skynet"--让当前的任务等待 time * 0.01s 。skynet.sleep(time) ​--启动一个新的任务去执行函数 func , 其实就是开了一个协程,函数调用完成将返回线程句柄--虽然你也可以使用原生的coroutine.create来创建协程,但是会打乱skynet的工作流程skynet.for...

2018-03-03 20:54:09 8911 8

原创 skynet框架应用 (五) 服务别名

5 服务别名​ 每个服务启动之后,都有一个整形数来表示id,也可以使用字符串id来表示,例如::01000010,其实就是把id:0x01000010转换成字符串。​ 但是这个数字的表示方式会根据服务的启动先后顺序而变化,不是一个固定的值。如果想要方便的获取某个服务,那么可以通过给服务设置别名来。​ 5.1 本地别名与全局别名​ 在skynet中,服务别名可以分为两种:一种是本地别名,本地别名只能...

2018-03-03 20:52:16 5767 5

原创 skynet框架应用 (四) 服务类型

4 服务类型​ skynet中的服务分为普通服务与全局唯一服务。第3节启动方式就是一个普通服务,而全局唯一服务顾名思义就是在skynet中只能生成一个服务实例。4.1 普通服务​ 每调用一次创建接口就会创建出一个对应的服务实例,可以同时创建成千上万个,用唯一的id来区分每个服务实例。使用的创建接口是:--[[1. 用于启动一个新的 Lua 服务,luaServerName是脚本的名字(不用写 ...

2018-03-03 20:50:05 8426

原创 skynet框架应用 (三) 构建服务的基础API

3 构建服务的基础APIlocal skynet = require "skynet" ​--conf配置信息已经写入到注册表中,通过该函数获取注册表的变量值skynet.getenv(varName) 。​--设置注册表信息,varValue一般是number或string,但是不能设置已经存在的varnameskynet.setenv(varName, varValue) ​-...

2018-03-03 20:47:06 11931 3

原创 skynet框架应用 (二) 搭建skynet

2 在ubuntu上搭建skynet2.1 获取skynet源代码安装git代码管理工具​ $ sudo apt-get update $ sudo apt-get install git  ​ 注意:如果安装失败,请先安装一下只支持库 $ sudo apt-get install build-essential libssl-dev libcurl4-gnutls-dev libexpat1-...

2018-03-03 20:42:02 11451 6

原创 skynet框架应用 (一) skynet介绍

1 skynet介绍​ Skynet 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。是一个轻量级的为在线游戏服务器打造的框架。我在云风博客的基础上,把重要的知识点加上具体的example来讲解skynet如何去使用。前面的比较啰嗦一些,大家不想了解这些知识的,可以直接跳转到第二章节。  1.1 简介​ 这个系统是单进程多线程模型。​ 每...

2018-03-03 20:39:35 37747 4

原创 git代码仓库使用

git代码仓库使用1、 如果使用git与远端仓库连接#使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。git clone [url]​#如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:git initgit remote add origin [url]​git remote set-url origin...

2018-03-03 18:06:31 2756

原创 linux 查看进程打开的文件

查看进程打开的文件lsof [options] [name]例如:源码test.c#include <stdio.h>#include <unistd.h>int main(void){ FILE* fp = fopen("file", "w"); if(fp == NULL) { return 1; } wh...

2018-03-03 17:25:57 4468

原创 linux gdb的使用

gdb的使用​ gdb(GNU symbolic debugger)是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 start #开始调试,停在第一行代码处,(gdb)startl #list的缩写查看源代码,(gdb)lb <lines>   #b: Breakpo...

2018-03-03 17:24:37 6319

原创 ubuntu下搭建samba服务器

samba服务器​ Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。​ 我们可以使用samba来实现我们Linux虚拟机与windows主机文件共享,便于开发。第一步安装samb...

2018-03-03 17:21:49 298

原创 ubuntu下搭建nfs服务器

nfs服务器​ NFS(Network File System)即网络文件系统, 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。nfs是通过挂载的方式来访问。安装nfs服务器sudo apt-get install nfs-kernel-server设置/etc/exports配置文件sudo vi /etc/exports​/hom...

2018-03-03 17:21:00 3025

原创 ubuntu下搭建ftp服务端

ftp服务器的搭建​ FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。​ FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。​ 默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。1 安装vsftpd使用apt-get 安装sudo apt-get install v...

2018-03-03 17:19:12 392

原创 Libevent应用(六)从bufferevent中取出evbuffer

6 从bufferevent中取出evbufferstruct evbuffer* bufferevent_get_input(struct bufferevent *bufev); //取出输入缓冲区struct evbuffer* bufferevent_get_output(struct bufferevent *bufev); //取出输出缓冲区​/*对evbuffer的操作*/​...

2018-03-03 17:12:35 938

原创 Libevent应用 (五) 连接监听器,接收tcp连接

5 连接监听器,接收tcp连接5.1  创建和释放evconnlistener#include <event2/listener.h>struct evconnlistener *evconnlistener_new_bind(struct event_base *base,    evconnlistener_cb cb, void *ptr, unsigned flags, i...

2018-03-03 16:58:31 741

原创 Libevent应用 (四) 辅助类型和函数

4 辅助类型和函数4.1 基本类型4.1.1 evutil_socket_t​ 在除Windows之外的大多数地方,套接字是个整数,操作系统按照数值次序进行处理。然而,使用Windows套接字API时,socket具有类型SOCKET,它实际上是个类似指针的句柄,收到这个句柄的次序是未定义的。在Windows中,libevent定义evutil_socket_t类型为整型指针,可以处理socket...

2018-03-03 16:56:50 489

原创 Libevent应用 (三) 数据缓冲

3 数据缓冲​ ​ 很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。比如说,写入数据的时候,通常的运行模式是:​ (1)决定要向连接写入一些数据,把数据放入到缓冲区中​ (2)等待连接可以写入​ (3)写入尽量多的数据​ (4)记住写入了多少数据,如果还有更多数据要写入,等待连接再次可以写入​ ​ 这种缓冲IO模式很通用,libevent为此提供了一种通用机制,即bufferevent。...

2018-03-03 16:55:23 1998

Qt实现无边框桌面动图

用paintEvent事件绘制窗口,实现动态的桌面小精灵

2016-07-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除