« MongoDB lua driver | 返回首页 | Hive , Lua 的 actor 模型 »

重写了 skynet 中的 socket 库

前几天在做 skynet 的 mongodb driver ,感觉以前为 skynet 做的 socket 库不太好用。

以前 skynet 对外的网络连接是通过 connection 服务实现的,这个服务会自动推送绑定的 socket 的上行数据到指定的位置。接下来,需要自己用 coroutine 去分析这个数据流。这样做比设计一个询问应答接口来获取 socket 上的数据流要高效一些,但用起来很不方便。

我希望能有一个看起来和传统的 socket api 类似的接口,直接 read/write 即可,但又不想失去性能。而且 read 不能阻塞住系统线程。

这次重新实现了 connection 服务,就把接口也改过来了,新的服务叫 socket 以便于和之前区分。

新的 socket 服务除了读数据外,也加上了写缓冲。这个改动类似于前几天对 gate 服务的修改。修改过程中,我把 epoll 和 kqueue 相关的代码抽取出来,独立在一个 event.h 的头文件去了。

api 改动最大的是 socket.lua 这个库,增加了 read write readline 等接口。由于 skynet 的 service 在分发包的时候可以利用 coroutine 并发。如果直接用 read 去解析数据包的话,若有多个 coroutine 同时解析同一个 fd ,就有可能产生混乱。我增加了对 fd 的锁来回避这个问题。

当然,一般是不会直接使用 socket 这个底层库的。一个应用 socket 库的案例是重新编写的 redis 库

老版的 redis 是先建立一个 redis-cli.lua 的服务,统一和外部 redis server 交互。有了新版 socket 库后,直接去和外部 redis server 建立连接就可以了。

Comments

@szzg007
你们玩得很宽啊

FPS。唉。一直是个梦想呀。但现在没机会。现在开始用STENCYL开发2D小游戏了。自己开发着玩,现在是产品人

看了一下源码,有个地方想问一下。就是
report_accept的时候,new_fd() 的最后一个参数为什么不用true,把clientfd 添加到kqueue中呢?

使用c 不久,有什么低级的问题,请见谅。

找到原因了,,,我自己用c写了一个watchdog,传给client的参数是%d %x %d,,,修改了client的参数解析为%d %x %d,,,使用你的lua版watchdog,需要修正client传入参数为%d %d %d,,,不然就出错了。

@cloud,你好。
在试用你的代码过程中,我没有启动log服务器,然后用client连接上后,可以发送消息到gate server,但是从gatesever的消息返回不了client,提示:
==Client== sz[17] msg[Welcome to skynet]
[1000003] Drop message to harbor 22 from 1000015 to 16777235 (session = 0, msgsz = 23)
[1000001] Can't connect to harbor 22 :

好像是send消息环节。我这里没有多个harbor,master为何要去连接其他harbor?

或者我其他地方错了,能否指教下。

你精力充沛 充满激情 不断优化自己的代码

@Anonymous
可惜。一直没有能找到合适的温床。FPS/TPS虽有大爱。但,缘终归为缘。现在从事手游制作人。自己设计了一系例的小智力挑战小游戏。正在开发中。

@Cloud
现在在干嘛呢?在做自己的事啦?想当年。你不定期杭的时候。好像,我正好准备出国。呵呵。如果没记错的话,应该是你买TGB的时候,我们好像有沟通过。

看到一个熟悉的名字,szzg007你们的torque FPS产品怎么样了

@szzg007

我对 fps 类无爱

而且现在也没有精力.

是我弄错了...

Launch gate L ! 0.0.0.0:2013 5 256 0 failed
跑不起来了。。。

云风.第一次与你尝试沟通.不知道你是否会回应.简单的表明下我的来意吧.一起做个FPS游戏吧.怎么样?哪怕只是为了好玩.如何?

Post a comment

非这个主题相关的留言请到:留言本