diff options
| author | ruki <[email protected]> | 2019-10-27 21:59:08 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-10-27 21:59:08 +0800 |
| commit | fa792567b7df02cf604863589b33405c0c921f54 (patch) | |
| tree | 901829f5e5460de1d085a80a42cfad3e6b57710f | |
| parent | 433872bafb966f4c5d613f0a65795bf54149fdcd (diff) | |
concat socket.recv data
| -rw-r--r-- | core/src/xmake/io/socket_recv.c | 16 | ||||
| -rw-r--r-- | xmake/core/base/socket.lua | 4 |
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 |
