summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-10-27 21:59:08 +0800
committerruki <[email protected]>2019-10-27 21:59:08 +0800
commitfa792567b7df02cf604863589b33405c0c921f54 (patch)
tree901829f5e5460de1d085a80a42cfad3e6b57710f
parent433872bafb966f4c5d613f0a65795bf54149fdcd (diff)
concat socket.recv data
-rw-r--r--core/src/xmake/io/socket_recv.c16
-rw-r--r--xmake/core/base/socket.lua4
2 files changed, 16 insertions, 4 deletions
diff --git a/core/src/xmake/io/socket_recv.c b/core/src/xmake/io/socket_recv.c
index d3a91a997..bfb4fd1d1 100644
--- a/core/src/xmake/io/socket_recv.c
+++ b/core/src/xmake/io/socket_recv.c
@@ -48,7 +48,7 @@ tb_int_t xm_io_socket_recv(lua_State* lua)
tb_socket_ref_t sock = (tb_socket_ref_t)lua_touserdata(lua, 1);
tb_check_return_val(sock, 0);
- // get size
+ // get data and size
tb_byte_t data[8192];
tb_long_t size = 0;
if (lua_isnumber(lua, 2)) size = (tb_long_t)lua_tonumber(lua, 2);
@@ -61,12 +61,24 @@ tb_int_t xm_io_socket_recv(lua_State* lua)
if (size > sizeof(data))
size = sizeof(data);
+
// recv data
tb_long_t real = tb_socket_recv(sock, data, size);
lua_pushnumber(lua, (tb_int_t)real);
if (real > 0)
{
- lua_pushlstring(lua, (tb_char_t const*)data, real);
+ // init result
+ luaL_Buffer result;
+ luaL_buffinit(lua, &result);
+
+ // prepend the previous data and size first
+ size_t prev_size = 0;
+ tb_char_t const* prev_data = luaL_optlstring(lua, 3, "", &prev_size);
+ if (prev_data && prev_size) luaL_addlstring(&result, prev_data, prev_size);
+ luaL_addlstring(&result, (tb_char_t const*)data, real);
+
+ // save result
+ luaL_pushresult(&result);
return 2;
}
return 1;
diff --git a/xmake/core/base/socket.lua b/xmake/core/base/socket.lua
index 31f23389d..a90659659 100644
--- a/xmake/core/base/socket.lua
+++ b/xmake/core/base/socket.lua
@@ -241,10 +241,10 @@ function _instance:recv(size, opt)
local recv = 0
local real = 0
local wait = false
- local data_or_errors = nil
+ local data_or_errors = opt.prevdata
if opt.block then
while recv < size do
- real, data_or_errors = io.socket_recv(self._SOCK, size - recv)
+ real, data_or_errors = io.socket_recv(self._SOCK, size - recv, data_or_errors)
if real > 0 then
recv = recv + real
wait = false