summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-10-27 14:41:13 +0800
committerruki <[email protected]>2019-10-27 14:41:13 +0800
commit6df3d8bf595b3645022b4d465fd1192f9033913e (patch)
tree7f18711b1e4a9a88e1dfaa5840db71869b1e045c
parent74fe92ec5fab1725b139567f468f49cab4580888 (diff)
add socket.recv
-rw-r--r--core/src/xmake/io/socket_recv.c33
-rw-r--r--core/src/xmake/io/socket_send.c20
-rw-r--r--tests/modules/socket/tcp/echo_server.lua8
-rw-r--r--xmake/core/base/socket.lua15
-rw-r--r--xmake/core/sandbox/modules/import/core/base/socket.lua15
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