Skip to content
重归混沌 edited this page Jul 29, 2020 · 7 revisions

silly核心代码不提供网络数据组包功能。

这也意味着它对你的你的网络协议设计没有任何限制,你可以在应用层以任何你喜欢的方式进行数据组装。

但基于功能完整性,silly还是提供了netpacket和netstream两种数据组装方式。

netpacket主要用于数据打包及组装

wire protocol:

  • 每一个完整的数据包分为两个部分:包头(head)和内容(body)。
  • head为字节序为大端的uint16_t类型,用于指明后面body的长度
  • body为head指明长度的一块二进制内存数据

以C语言的数据结构来举个例子:

    char data[] = "hello";
    //data经过netpacket打包完成后的数据如下:
    00:07 00 05 'h' 'e' 'l' 'l' 'o'

接口:

  • netpacket.create() 创建一个队列缓冲区queue,netpacket之后提供的所有的操作都是基于某一个queue进行的, 多个socket可共用一个queue。

  • netpacket.message(queue, msg) 用来接收需要netpacket模块关注的socket的消息,queue为netpacket.create创建的队列。netpacket.message收到消息后会触发组包工作。

  • netpacket.pop(queue) 将组包完成的socket数据包从queue中弹出,此函数会返回fd(socket连接ID), buffer(数据包的指针), size(数据包的长度)

  • netpacket.tostring(buffer, size) 将netpacket.pop返回的buffer和size转换成lua使用的string, 并将buffer指向的内存释放。

  • netpacket.clear(queue, fd) 当某个socket被主动关闭时, 需要主动触发此函数来清理此socket组包所占用的空间。

  • netpacket.pack(buff, size) 将buffer中指向的内存数据,按netpacket的wireprotocol进行打包,size为buff中数据的长度。

netpacket目前被用在saux/msg.lua和saux/rpc.lua模块中进行组包和打包工作。

netstream

netstream并不进行数据组装,它把所有数据都当作字节流缓存起来,供外部程序以两种方式:

  • netstream.read(nb, n) 读取按指定长度的数据
  • netstream.readline(nb, n)读取所有数据直到碰到特定字符串才会停止(一般被用来读取一行)

接口:

  • netstream.push(nb, message) 将message(由socket_thread发出)中的数据压入nb([node buffer]socket缓冲区)。如果nb为nil, push函数会创建一个新的nb并返回。与netpacket不同的是,多个socket不可共用一个nb。因此message所属的fd(socket id)必须与nb一一对应。
  • netstream.read(nb, size) 从nb中读出size个字节,如果nb中数据不足,则返回nil。
  • netstream.readline(nb, delim) 从nb中读出一串以delim结尾的字符。如果没有以delim结尾的字符则返回nil。
  • netstream.check(nb) 返回当前nb中有多少字节数据
  • netstream.clear(nb) 请空nb中所有数据。

netstream被用在socket.lua模块中做缓冲区使用。

Clone this wiki locally