summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-04-07 22:41:50 +0800
committerruki <[email protected]>2022-04-07 22:41:50 +0800
commit226351fea82959c5f80bda68546411099e7b4074 (patch)
tree8cb0eb6583123a6912815a7264cd315416e9c52b
parentda0d547ca4cbfe5fd61e173d398460874d0e758e (diff)
improve stream recv
-rw-r--r--xmake/modules/private/service/server/server.lua21
-rw-r--r--xmake/modules/private/service/stream.lua29
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)