diff options
| author | ruki <[email protected]> | 2022-04-07 22:41:50 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-04-07 22:41:50 +0800 |
| commit | 226351fea82959c5f80bda68546411099e7b4074 (patch) | |
| tree | 8cb0eb6583123a6912815a7264cd315416e9c52b | |
| parent | da0d547ca4cbfe5fd61e173d398460874d0e758e (diff) | |
improve stream recv
| -rw-r--r-- | xmake/modules/private/service/server/server.lua | 21 | ||||
| -rw-r--r-- | xmake/modules/private/service/stream.lua | 29 |
2 files changed, 25 insertions, 25 deletions
diff --git a/xmake/modules/private/service/server/server.lua b/xmake/modules/private/service/server/server.lua index 96adf49dd..534a2da15 100644 --- a/xmake/modules/private/service/server/server.lua +++ b/xmake/modules/private/service/server/server.lua @@ -120,24 +120,11 @@ end -- handle session function server:_handle_session(sock) print("%s: %s session connected", self, sock) - local real = 0 - local recv = 0 - local data = nil - local wait = false - local buff = bytes(8192) + local rstream = stream(sock) while true do - real, data = sock:recv(buff, 8192) - if real > 0 then - if data then - end - recv = recv + real - wait = false - elseif real == 0 and not wait then - if sock:wait(socket.EV_RECV, -1) == socket.EV_RECV then - wait = true - else - break - end + local data = rstream:recv_string() + if data then + print("%s", data) else break end diff --git a/xmake/modules/private/service/stream.lua b/xmake/modules/private/service/stream.lua index c785777de..bda7aa2c0 100644 --- a/xmake/modules/private/service/stream.lua +++ b/xmake/modules/private/service/stream.lua @@ -30,14 +30,11 @@ function stream:init(sock) self._SOCK = sock self._RCACHE = bytes(8192) self._RCACHE_SIZE = 0 -end - --- is empty? -function stream:empty() + self._RECVBUFF = bytes(65536) end -- send bytes -function stream:send_bytes(data) +function stream:send(data) end -- send table @@ -48,8 +45,9 @@ end function stream:send_string(str) end --- recv bytes -function stream:recv_bytes(buff, size) +-- recv the given bytes +function stream:recv(buff, size) + assert(size <= buff:size()) -- read data from cache first local buffsize = 0 @@ -72,6 +70,7 @@ function stream:recv_bytes(buff, size) local real = 0 local data = nil local wait = false + local errors = nil while buffsize < size do real, data = sock:recv(cache) if real > 0 then @@ -100,18 +99,32 @@ function stream:recv_bytes(buff, size) break end else - -- TODO break end end end +-- recv u16be +function stream:recv_u16be() + local data = self:recv(self._RECVBUFF, 2) + if data then + return data:u16be() + end +end + -- recv table function stream:recv_table() end -- recv string function stream:recv_string() + local size = self:recv_u16be() + if size then + local data = self:recv(self._RECVBUFF, size) + if data then + return data:str() + end + end end function main(sock) |
