xjdrew / levent

lua concurrency library based on libev, similar with gevent
MIT License
190 stars 61 forks source link

修改mongo 接受数据过大,粘包时无法读取包内容 #33

Closed fanyh closed 4 years ago

xjdrew commented 4 years ago

我觉得没必要在socket上until_recv方法; 在使用的地方多调用几次recv就可以了。 socket接口是参考python的接口制定的;

fanyh commented 4 years ago

被分包是一个比较常态的问题(包体过大); 我认为应该在网络层处理buf粘连 业务层只需要知晓 read到的buf是否合法,然后处理对应逻辑即可 这样对于逻辑和网络层切割会更加干净一些 ps:我尝试在业务层实现了分包粘连,阅读起来始终觉得怪怪的。实现了几种方案,也就如下这种看上去比较合理 exp:

local function readbuf(socket, length)
    local reply = ""
    while #reply < length do
        local ret,err = sock:recv(length - #reply)
        if not ret then
            return nil,err
        end 

        reply = reply .. ret
    end 

    return reply
end 

local function get_reply(sock, result)
    local length = driver.length(sock:recv(4))
    local reply = readbuf(sock, length)
    return reply, driver.reply(reply, result)
end 

这种方式也只有在业务层里面做个sock:recv 的swap 其他逻辑中如果需要处理分包又需要实现一次util_recv 是否采用这种方式来实现呢?

xjdrew commented 4 years ago

可以把readbuf这个方法放到socket_util.lua,命名叫read_full。怎么样?

xjdrew commented 4 years ago

命名参考了这里:https://golang.org/pkg/io/#ReadFull

fanyh commented 4 years ago

这样没问题,即没破坏socket的接口制定,也完成了封装,我修改完你看看