- 博客(19)
- 收藏
- 关注
原创 【Socket编程】非阻塞connect
阅读Skynet源码的过程中,发现一种非阻塞connect方式。以前不知道,这次好好学习一下。文章参考自:非阻塞connect编写方法介绍(董的博客)TCP连接的建立涉及到一个三次握手的过程,鉴于RTT波动范围很大,从局域网的几个毫秒到几百个毫秒甚至广域网上的几秒。这段时间内,我们可以执行其他处理工作,以便做到并行。因此,非阻塞connect可以为我所用。1、fcn
2017-09-28 15:06:13 1180
原创 【Skynet】C头文件不要定义函数?
参考自:函数实现不放在头文件的原因,及何时可以放头文件的情况(绿色冰点)对于C/C++我们很早就被告知不要在头文件里定义函数,这样不好。今天学习Skynet时,发现里面有很多函数都定义在头文件里?很是疑问,于是有了这篇文章。把函数定义在头文件有哪些主要缺点?1、不利于代码理解和维护:通常,头文件被用来唯一指定接口,且多少提供一些文档来说明如何使用在该文件中声明的组件
2017-09-25 15:57:24 4134 1
原创 【Lua】Lua与C交互
上一篇文章简单介绍了在Lua中如何调用C,其中的原理还是需要稍微深究一下。文章参考自:Lua和C交互的简易教程(HansChen的博客)C/C++与Lua交互的基础源于虚拟栈。在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶一个简单的例子:#include #includ
2017-09-25 10:03:22 1866
原创 【TCP】TCP拥塞控制小记
相比UDP,TCP有拥塞控制。《计算机网络》这本书以Tahoe与Reno为例介绍了TCP的拥塞控制。1、慢启动和拥塞避免是必须的。这两点不同之处在于拥塞窗口 cwnd 增速不同。慢启动以指数增长,拥塞避免则以线性增长。2、拥塞丢包的判断主要两种方式:1)发送发超时;2)发送方收到3次冗余ACK3、与Tahoe相比,Reno还具有快速恢复。对与以上两种丢包,Tahoe都将慢启动阈
2017-09-24 16:16:58 439
原创 【Lua】Lua调用C动态库
lua 好归好,但有很多对效率要求较高的服务,还得让C来完成。本篇学习下Lua如何调用C。最重要的部分:定义一个 luaopen_* 函数,并调用 luaL_openlib 函数int luaopen_mylib(lua_State *L){ luaL_Reg l[] = { {"test1",test1}, # key-val,相
2017-09-22 17:16:18 2862
原创 【Skynet】socket与多服务
回顾之前服务器端的TCP连接:socket.listen(address, port) 监听一个端口,返回一个 id ,供 start 使用。socket.start(id , accept) accept 是一个函数。每当一个监听的 id 对应的 socket 上有连接接入的时候,都会调用 accept 函数。这个函数会得到接入连接的 id 以及 ip 地址。你可以做后续操作。
2017-09-21 21:13:25 1748
原创 【Skynet】Sproto初学与应用
参考自:Skynet基础入门例子详解(5)(魔王魂影)Sproto是云风专门为Skynet开发的轻量协议。借鉴官方例子,我们可以在 ./examples/proto.lua 中添加自己的一个 “say” 协议local sprotoparser = require "sprotoparser"local proto = {}proto.c2s = sprotopar
2017-09-20 21:54:08 3879
转载 【Socket编程】Tcp连接中accept生成新socket与监听socket的区别
参考自:socket的accept函数解析以及服务器和多个客户端的端口问题(L未若的博客)新建立的连接使用的端口号是否和listen所用端口号相同呢?如果认为是会分配新的端口,就大错特错了。因为:1、现在使用多路IO复用epoll等,配置好点的服务器可以支持数十万个并发连接,而端口号只有16位,最多才65535,且加上一些常用的端口号不能使用,可用的端口号都没那么多。2、现
2017-09-20 11:03:56 5272
原创 【Skynet】文件传输升级版
上一个socket文件传输过于简单,师傅让我进一步改进,定义包结构,让文件的传输过程更加自由。该实现可以参考./examples/client.lua ,这里面有数据的打包与解包。这里我设计了一个简易的报文结构。Length:即Type+Content的长度。Type:将报文分成两种,一种为信息报文,包含文件名及文件大小,以字符串"01"表示,一种为数据报文,以字符串"
2017-09-19 14:33:39 750
原创 【Skynet】使用skynet在服务器与客户端间传输文件
这是一个简单的文件传输例子,使用了skynet封装的socket接口。熟悉一个框架最好的方法就是用它。skynet有一个“服务(service)”的概念,每个服务类似与一个模块,完成特定的任务,启动一个服务可以使用 newservice() 或 uniqueservice()。首先是客户端:package.cpath = "luaclib/?.so"package.path
2017-09-18 10:27:05 2050
原创 【Socket编程】Python用udp实现简易ping
用Python实现一个简易的ping程序,客户端发送一个简易的ping报文,接收到该信息的服务器返回对应的pong报文,然后客户端计算RTT。由于UDP不是可靠协议,需要为该程序设置超时机制,超时1秒后将假设报文没有收到,并打印出超时提示。服务器实现如下:import socketimport errnoimport osHOST, PORT = "", 8888def
2017-09-17 15:28:48 5807
原创 【Socket编程】Python实现简易Web服务器
利用Python,我们可以搭建一个简单的Web服务器,这里我参考了:https://ruslanspivak.com/lsbaws-part1/
2017-09-10 18:19:56 6962 5
原创 【Socket编程】篇七之Python实现Socket
一年前使用过C来实现Socket,如今见识了脚本的便利之后,我来尝试用Python再次实现一遍。UDP:客户端:import socketserverName = "127.0.0.1"serverPort = 12000clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)message = ra
2017-09-10 16:45:14 882
原创 【Lua】初探协程
类似于线程,协程拥有自己独立的栈、局部变量和指令指针。多个协程共享全局变量和其它大部分东西。线程与协程的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协程却需要彼此协作的运行。就是说,一个具有多个协程的程序在任意时刻只能运行一个协程,并且正在运行的协程只会在其显式地要求挂起时,它的执行才会暂停。Lua将所有关于协程的函数放置在一个名为“coroutine”的table中。
2017-09-08 14:20:01 488
原创 【Lua】面向对象
Lua使用table来面向对象。一个简单的 Account 类:Account = {balance = 0}function Account.sub(self, v) self.balance = self.balance - venda = Accounta.sub(a, 10)
2017-09-06 09:43:44 348
原创 【Lua】“诡异”的return
类似其他语言,Lua也有return关键字,但需要注意其用法。因为它只能用在block结束的地方, 不能用在block的一个中间部分。想要使用 return 提前返回的童鞋注意了!例子:function fun() i = 1 return i i = 2endfun()结果报错:lua: a.lua:4: 'end' expected (to close 'f
2017-09-05 17:10:23 5850 3
原创 【Lua】元表初学
metatable,Lua中的元表,是Lua中重要的内容。参考自:Lua中的元表与元方法(果冻想)在Lua代码中,只能设置table的元表。若要设置其它类型的值的元表,则必须通过C代码来完成。还存在一个特例,对于字符串,标准的字符串程序库为所有的字符串都设置了一个元表,而其它类型在默认情况下都没有元表。下面用一个简单的例子初探元表:__add元方法:
2017-09-05 16:04:33 368
原创 【Lua】迭代器初学
和C++类似,Lua也有迭代器,如泛型for。泛型for需要三个值:迭代函数、状态常量、控制变量无状态的迭代器:无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。这种无状态迭代器的典型的简单的例子是i
2017-09-04 18:12:35 445
原创 Skynet安装及配置
Skynet是云风写的轻量级游戏服务器。首先Git源代码。按照提示 make linux 进行编译。遇到一些问题:1、缺少autoconfsudo apt-get install autoconf2、缺少readlinesudo apt-get install libreadline-dev安装完后进入 skynet,重新 make li
2017-09-03 17:43:23 2225
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人