summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2019-11-04 22:19:43 +0800
committerruki <[email protected]>2019-11-04 07:58:23 +0800
commit860571059e3d30da620110e646be3b9a537333fe (patch)
treefeb1365b2bfbeea516949b07a1662a6ab9cd411d /core/src
parent7a63343afae6bf51e25ec4b7d2d8cdf704de3c1a (diff)
fix socket send
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/io/socket_send.c39
-rw-r--r--core/src/xmake/io/socket_sendto.c35
2 files changed, 62 insertions, 12 deletions
diff --git a/core/src/xmake/io/socket_send.c b/core/src/xmake/io/socket_send.c
index ed9e864e1..8cce64f29 100644
--- a/core/src/xmake/io/socket_send.c
+++ b/core/src/xmake/io/socket_send.c
@@ -53,14 +53,39 @@ tb_int_t xm_io_socket_send(lua_State* lua)
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);
+ tb_size_t size = 0;
+ tb_byte_t const* data = tb_null;
+ if (lua_istable(lua, 2))
+ {
+ // get data address
+ lua_pushstring(lua, "data");
+ lua_gettable(lua, 2);
+ data = (tb_byte_t const*)(tb_size_t)(tb_long_t)lua_tonumber(lua, -1);
+ lua_pop(lua, 1);
+
+ // get data size
+ lua_pushstring(lua, "size");
+ lua_gettable(lua, 2);
+ size = (tb_size_t)lua_tonumber(lua, -1);
+ lua_pop(lua, 1);
+ }
+ else
+ {
+ size_t datasize = 0;
+ data = (tb_byte_t const*)luaL_checklstring(lua, 2, &datasize);
+ size = (tb_size_t)datasize;
+ }
+ if (!data || !size)
+ {
+ lua_pushnumber(lua, -1);
+ lua_pushfstring(lua, "invalid data(%p) and size(%zu)!", data, size);
+ return 2;
+ }
// get start
tb_long_t start = 1;
if (lua_isnumber(lua, 3)) start = (tb_long_t)lua_tonumber(lua, 3);
- if (start < 1 || start > datasize)
+ if (start < 1 || start > size)
{
lua_pushnumber(lua, -1);
lua_pushfstring(lua, "invalid start position(%ld)!", start);
@@ -68,9 +93,9 @@ tb_int_t xm_io_socket_send(lua_State* lua)
}
// get last
- tb_long_t last = (tb_long_t)datasize;
+ tb_long_t last = (tb_long_t)size;
if (lua_isnumber(lua, 4)) last = (tb_long_t)lua_tonumber(lua, 4);
- if (last < start - 1 || last > datasize + start - 1)
+ if (last < start - 1 || last > size + start - 1)
{
lua_pushnumber(lua, -1);
lua_pushfstring(lua, "invalid last position(%ld)!", last);
@@ -78,7 +103,7 @@ tb_int_t xm_io_socket_send(lua_State* lua)
}
// send data
- tb_long_t real = tb_socket_send(sock, (tb_byte_t const*)data + start - 1, last - start + 1);
+ tb_long_t real = tb_socket_send(sock, data + start - 1, last - start + 1);
lua_pushnumber(lua, (tb_int_t)real);
return 1;
}
diff --git a/core/src/xmake/io/socket_sendto.c b/core/src/xmake/io/socket_sendto.c
index ed3e18261..6b1f8fa49 100644
--- a/core/src/xmake/io/socket_sendto.c
+++ b/core/src/xmake/io/socket_sendto.c
@@ -53,9 +53,34 @@ tb_int_t xm_io_socket_sendto(lua_State* lua)
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);
+ tb_size_t size = 0;
+ tb_byte_t const* data = tb_null;
+ if (lua_istable(lua, 2))
+ {
+ // get data address
+ lua_pushstring(lua, "data");
+ lua_gettable(lua, 2);
+ data = (tb_byte_t const*)(tb_size_t)(tb_long_t)lua_tonumber(lua, -1);
+ lua_pop(lua, 1);
+
+ // get data size
+ lua_pushstring(lua, "size");
+ lua_gettable(lua, 2);
+ size = (tb_size_t)lua_tonumber(lua, -1);
+ lua_pop(lua, 1);
+ }
+ else
+ {
+ size_t datasize = 0;
+ data = (tb_byte_t const*)luaL_checklstring(lua, 2, &datasize);
+ size = (tb_size_t)datasize;
+ }
+ if (!data || !size)
+ {
+ lua_pushnumber(lua, -1);
+ lua_pushfstring(lua, "invalid data(%p) and size(%zu)!", data, size);
+ return 2;
+ }
// get address
tb_char_t const* addr = lua_tostring(lua, 3);
@@ -72,10 +97,10 @@ tb_int_t xm_io_socket_sendto(lua_State* lua)
// init ip address
tb_ipaddr_t ipaddr;
- tb_ipaddr_set(&ipaddr, addr, port, family);
+ tb_ipaddr_set(&ipaddr, addr, port, (tb_uint8_t)family);
// send data
- tb_long_t real = tb_socket_usend(sock, &ipaddr, (tb_byte_t const*)data, (tb_size_t)datasize);
+ tb_long_t real = tb_socket_usend(sock, &ipaddr, data, size);
lua_pushnumber(lua, (tb_int_t)real);
return 1;
}