消息体需要有分隔符,magic number可以充当分隔符,放在消息体的开头,防止粘包?
消息体的codec方法可以与消息体进行绑定,成为一个Object.
epoll_event结构体中存在void* ptr,可以进行绑定
channel与packet是否应该存在deadline?
socket的读写可以设置次数限制,提升效率?没处理的怎么办,设置event?
一个connection对应一个ChannelPool ?
ChannelPool里有多个channel
ChannelPool维护freelist,used_list等结构
从freelist中取channel,之后放入used_list
每一个channel有一个uniqueId,
id -> channel 使用map进行存储
收到包后进行header的构造,检查data部分的合法性,例如长度
根据header.id在map中寻找channel
每一种packet-obj都有绑定对应的codec方法,进行packet构造后(factory 自定义实现?)
可以根据header,data进行codec操作
channel中有handler(client端),connection中有serveradapter,用来进行packet的具体处理,
处理过程自定义
ioc的构造需要Socket或ServerSocket(对native socket的封装)
在setEvent方法中,iocomponent会绑定到epollevent.data.ptr,同时会对epfd的interests set进行修改
connection的postpacket方法会将packet加入到outputQueue中,outputQueue的写操作,会在eventloop中进行调用(epoll_wait之后如果可写),
写操作复制并清空outputQueue,之后将数据写入databuffer,最后从databuffer对socket进行批量的写操作(batch)
ioc链表存储在transport中。
ioc的checketimeout方法,并不是每个ioc都相同。可能会进行socket.shutdown操作,如果有绑定connection会检测channel和packet的deadline,查看是否过期,
ChannelPool中timeout的channel从used_list中进行查找,如果过期会集中发送timeoutPacket