diff options
| author | ruki <[email protected]> | 2019-10-27 14:41:13 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-10-27 14:41:13 +0800 |
| commit | 6df3d8bf595b3645022b4d465fd1192f9033913e (patch) | |
| tree | 7f18711b1e4a9a88e1dfaa5840db71869b1e045c | |
| parent | 74fe92ec5fab1725b139567f468f49cab4580888 (diff) | |
add socket.recv
| -rw-r--r-- | core/src/xmake/io/socket_recv.c | 33 | ||||
| -rw-r--r-- | core/src/xmake/io/socket_send.c | 20 | ||||
| -rw-r--r-- | tests/modules/socket/tcp/echo_server.lua | 8 | ||||
| -rw-r--r-- | xmake/core/base/socket.lua | 15 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/core/base/socket.lua | 15 |
5 files changed, 62 insertions, 29 deletions
diff --git a/core/src/xmake/io/socket_recv.c b/core/src/xmake/io/socket_recv.c index 849bc832a..d3a91a997 100644 --- a/core/src/xmake/io/socket_recv.c +++ b/core/src/xmake/io/socket_recv.c @@ -34,7 +34,7 @@ * implementation */ -// io.socket_recv(file, data, start, last) +// real, data_or_errors = io.socket_recv(file, size) tb_int_t xm_io_socket_recv(lua_State* lua) { // check @@ -48,21 +48,26 @@ 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 data - size_t datasize = 0; - tb_char_t const* data = luaL_checklstring(lua, 2, &datasize); - tb_assert_and_check_return_val(data, 0); - - // get start - tb_size_t start = 1; - if (lua_isnumber(lua, 3)) start = lua_tonumber(lua, 3); - - // get last - tb_size_t last = (tb_size_t)datasize; - if (lua_isnumber(lua, 4)) last = lua_tonumber(lua, 4); + // get size + tb_byte_t data[8192]; + tb_long_t size = 0; + if (lua_isnumber(lua, 2)) size = (tb_long_t)lua_tonumber(lua, 2); + if (size < 0) + { + lua_pushnumber(lua, -1); + lua_pushfstring(lua, "invalid size(%ld)!", size); + return 2; + } + if (size > sizeof(data)) + size = sizeof(data); // recv data - tb_long_t real = tb_socket_recv(sock, (tb_byte_t const*)data + start - 1, last - start + 1); + 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); + return 2; + } return 1; } diff --git a/core/src/xmake/io/socket_send.c b/core/src/xmake/io/socket_send.c index f33e77414..0b0e3767c 100644 --- a/core/src/xmake/io/socket_send.c +++ b/core/src/xmake/io/socket_send.c @@ -54,12 +54,24 @@ tb_int_t xm_io_socket_send(lua_State* lua) tb_assert_and_check_return_val(data, 0); // get start - tb_size_t start = 1; - if (lua_isnumber(lua, 3)) start = lua_tonumber(lua, 3); + tb_long_t start = 1; + if (lua_isnumber(lua, 3)) start = (tb_long_t)lua_tonumber(lua, 3); + if (start < 1 || start > datasize) + { + lua_pushnumber(lua, -1); + lua_pushfstring(lua, "invalid start position(%ld)!", start); + return 2; + } // get last - tb_size_t last = (tb_size_t)datasize; - if (lua_isnumber(lua, 4)) last = lua_tonumber(lua, 4); + tb_long_t last = (tb_long_t)datasize; + if (lua_isnumber(lua, 4)) last = (tb_long_t)lua_tonumber(lua, 4); + if (last < start - 1 || last > datasize + start - 1) + { + lua_pushnumber(lua, -1); + lua_pushfstring(lua, "invalid last position(%ld)!", last); + return 2; + } // send data tb_long_t real = tb_socket_send(sock, (tb_byte_t const*)data + start - 1, last - start + 1); diff --git a/tests/modules/socket/tcp/echo_server.lua b/tests/modules/socket/tcp/echo_server.lua index a047aa15f..7c200989b 100644 --- a/tests/modules/socket/tcp/echo_server.lua +++ b/tests/modules/socket/tcp/echo_server.lua @@ -13,6 +13,14 @@ function main() sock_client = sock:accept() if sock_client then print("%s: accepted", sock_client) + local recv, data = sock_client:recv(8192) + if recv == 0 then + print("wait ..") + ok = sock_client:wait(socket.EV_RECV, -1) + print("wait %d", ok) + recv, data = sock_client:recv(8192) + end + print("%s: recv %d, %s", sock_client, recv, data) sock_client:close() end end diff --git a/xmake/core/base/socket.lua b/xmake/core/base/socket.lua index e85ec0301..b2be9bc28 100644 --- a/xmake/core/base/socket.lua +++ b/xmake/core/base/socket.lua @@ -160,14 +160,13 @@ function _instance:send(data, start, last) end -- send it - local result, errors = io.socket_send(self._SOCK, data, start, last) - if result < 0 and errors then + local real, errors = io.socket_send(self._SOCK, data, start, last) + if real < 0 and errors then errors = string.format("%s: %s", self, errors) end - return result, errors + return real, errors end --- TODO -- recv data from socket function _instance:recv(size) @@ -178,11 +177,11 @@ function _instance:recv(size) end -- recv it - local result, errors = io.socket_recv(self._SOCK, data, size) - if not result and errors then - errors = string.format("%s: %s", self, errors) + local real, data_or_errors = io.socket_recv(self._SOCK, size) + if real < 0 and data_or_errors then + data_or_errors = string.format("%s: %s", self, data_or_errors) end - return result, errors + return real, data_or_errors end -- wait socket events diff --git a/xmake/core/sandbox/modules/import/core/base/socket.lua b/xmake/core/sandbox/modules/import/core/base/socket.lua index 082aabe4a..54f135a4e 100644 --- a/xmake/core/sandbox/modules/import/core/base/socket.lua +++ b/xmake/core/sandbox/modules/import/core/base/socket.lua @@ -107,11 +107,20 @@ end -- send data to socket function sandbox_core_base_socket_instance.send(sock, data, start, last) - local result, errors = sock:_send(data, start, last) - if result < 0 and errors then + local real, errors = sock:_send(data, start, last) + if real < 0 and errors then raise(errors) end - return result + return real +end + +-- recv data from socket +function sandbox_core_base_socket_instance.recv(sock, size) + local real, data_or_errors = sock:_recv(data, size) + if real < 0 and data_or_errors then + raise(data_or_errors) + end + return real, data_or_errors end -- get socket rawfd |
