summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-04-04 23:41:22 +0800
committerruki <[email protected]>2022-04-04 23:41:22 +0800
commitd19a15f735dbc8b07bed1178e1a077b495179a07 (patch)
tree576969f8ae155ed689d0826e39e10be03cc91e91
parentd7115ae9ce36bf98d54d4c48705c304f543c8c7b (diff)
add socket.ctrl
-rw-r--r--core/src/xmake/engine.c2
-rw-r--r--core/src/xmake/io/socket_ctrl.c65
-rw-r--r--core/src/xmake/makefile1
-rw-r--r--tests/modules/socket/sched_tcp/echo_client.lua2
-rw-r--r--tests/modules/socket/sched_tcp/echo_server.lua2
-rw-r--r--xmake/core/base/socket.lua21
-rw-r--r--xmake/core/sandbox/modules/import/core/base/socket.lua13
7 files changed, 106 insertions, 0 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c
index 2f4efd60c..005d2eebe 100644
--- a/core/src/xmake/engine.c
+++ b/core/src/xmake/engine.c
@@ -142,6 +142,7 @@ tb_int_t xm_io_socket_open(lua_State* lua);
tb_int_t xm_io_socket_rawfd(lua_State* lua);
tb_int_t xm_io_socket_wait(lua_State* lua);
tb_int_t xm_io_socket_bind(lua_State* lua);
+tb_int_t xm_io_socket_ctrl(lua_State* lua);
tb_int_t xm_io_socket_listen(lua_State* lua);
tb_int_t xm_io_socket_accept(lua_State* lua);
tb_int_t xm_io_socket_connect(lua_State* lua);
@@ -336,6 +337,7 @@ static luaL_Reg const g_io_functions[] =
, { "socket_rawfd", xm_io_socket_rawfd }
, { "socket_wait", xm_io_socket_wait }
, { "socket_bind", xm_io_socket_bind }
+, { "socket_ctrl", xm_io_socket_ctrl }
, { "socket_listen", xm_io_socket_listen }
, { "socket_accept", xm_io_socket_accept }
, { "socket_connect", xm_io_socket_connect }
diff --git a/core/src/xmake/io/socket_ctrl.c b/core/src/xmake/io/socket_ctrl.c
new file mode 100644
index 000000000..241f62ebf
--- /dev/null
+++ b/core/src/xmake/io/socket_ctrl.c
@@ -0,0 +1,65 @@
+/*!A cross-platform build utility based on Lua
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright (C) 2015-present, TBOOX Open Source Group.
+ *
+ * @author ruki
+ * @file socket_ctrl.c
+ *
+ */
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * trace
+ */
+#define TB_TRACE_MODULE_NAME "socket_ctrl"
+#define TB_TRACE_MODULE_DEBUG (0)
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * includes
+ */
+#include "prefix.h"
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * interfaces
+ */
+
+// io.socket_ctrl(sock, code, value)
+tb_int_t xm_io_socket_ctrl(lua_State* lua)
+{
+ // check
+ tb_assert_and_check_return_val(lua, 0);
+
+ // check socket
+ if (!xm_lua_ispointer(lua, 1))
+ {
+ lua_pushnumber(lua, -1);
+ lua_pushliteral(lua, "invalid socket!");
+ return 2;
+ }
+
+ // get socket
+ tb_socket_ref_t sock = (tb_socket_ref_t)xm_lua_topointer(lua, 1);
+ tb_check_return_val(sock, 0);
+
+ // get code
+ tb_size_t code = (tb_size_t)luaL_checkinteger(lua, 2);
+
+ // get value
+ tb_size_t value = (tb_size_t)luaL_checkinteger(lua, 3);
+
+ // control socket
+ lua_pushboolean(lua, tb_socket_ctrl(sock, code, value));
+ return 1;
+}
+
diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile
index d25a12a9b..2203b81b7 100644
--- a/core/src/xmake/makefile
+++ b/core/src/xmake/makefile
@@ -70,6 +70,7 @@ xmake_C_FILES += \
io/poller_spank \
io/poller_support \
io/socket_open \
+ io/socket_ctrl \
io/socket_rawfd \
io/socket_wait \
io/socket_bind \
diff --git a/tests/modules/socket/sched_tcp/echo_client.lua b/tests/modules/socket/sched_tcp/echo_client.lua
index 37470613e..61b53bdfd 100644
--- a/tests/modules/socket/sched_tcp/echo_client.lua
+++ b/tests/modules/socket/sched_tcp/echo_client.lua
@@ -42,6 +42,8 @@ function _session(addr, port)
if sock then
print("%s: connected!", sock)
table.insert(socks, sock)
+ sock:ctrl(socket.CTRL_SET_SENDBUFF, 100000 * 20)
+ sock:ctrl(socket.CTRL_SET_RECVBUFF, 100000 * 20)
scheduler.co_group_begin("test", function ()
scheduler.co_start(_session_recv, sock)
scheduler.co_start(_session_send, sock)
diff --git a/tests/modules/socket/sched_tcp/echo_server.lua b/tests/modules/socket/sched_tcp/echo_server.lua
index f1f502764..4ecd80191 100644
--- a/tests/modules/socket/sched_tcp/echo_server.lua
+++ b/tests/modules/socket/sched_tcp/echo_server.lua
@@ -45,6 +45,8 @@ function _listen(addr, port)
if sock_client then
print("%s: accepted", sock_client)
table.insert(sock_clients, sock_client)
+ sock_client:ctrl(socket.CTRL_SET_SENDBUFF, 100000 * 20)
+ sock_client:ctrl(socket.CTRL_SET_RECVBUFF, 100000 * 20)
scheduler.co_start(_session_recv, sock_client)
scheduler.co_start(_session_send, sock_client)
end
diff --git a/xmake/core/base/socket.lua b/xmake/core/base/socket.lua
index 4e6435c09..95a338ce7 100644
--- a/xmake/core/base/socket.lua
+++ b/xmake/core/base/socket.lua
@@ -45,6 +45,10 @@ socket.EV_SEND = 2
socket.EV_CONN = socket.EV_SEND
socket.EV_ACPT = socket.EV_RECV
+-- the socket control code
+socket.CTRL_SET_RECVBUFF = 2
+socket.CTRL_SET_SENDBUFF = 4
+
-- new a socket
function _instance.new(socktype, family, sock)
local instance = table.inherit(_instance)
@@ -92,6 +96,23 @@ function _instance:rawfd()
return result, errors
end
+-- control socket
+function _instance:ctrl(code, value)
+
+ -- ensure opened
+ local ok, errors = self:_ensure_opened()
+ if not ok then
+ return -1, errors
+ end
+
+ -- control it
+ local ok, errors = io.socket_ctrl(self:cdata(), code, value)
+ if not ok and errors then
+ errors = string.format("%s: %s", self, errors)
+ end
+ return ok, errors
+end
+
-- bind socket
function _instance:bind(addr, port)
diff --git a/xmake/core/sandbox/modules/import/core/base/socket.lua b/xmake/core/sandbox/modules/import/core/base/socket.lua
index c2aacc20b..f15f54c15 100644
--- a/xmake/core/sandbox/modules/import/core/base/socket.lua
+++ b/xmake/core/sandbox/modules/import/core/base/socket.lua
@@ -43,6 +43,10 @@ sandbox_core_base_socket.EV_SEND = socket.EV_SEND
sandbox_core_base_socket.EV_CONN = socket.EV_CONN
sandbox_core_base_socket.EV_ACPT = socket.EV_ACPT
+-- export the socket control code
+sandbox_core_base_socket.CTRL_SET_RECVBUFF = socket.CTRL_SET_RECVBUFF
+sandbox_core_base_socket.CTRL_SET_SENDBUFF = socket.CTRL_SET_SENDBUFF
+
-- wrap socket
function _socket_wrap(sock)
@@ -69,6 +73,15 @@ function sandbox_core_base_socket_instance.wait(sock, events, timeout)
return events
end
+-- control socket
+function sandbox_core_base_socket_instance.ctrl(sock, code, value)
+ local ok, errors = sock:_ctrl(code, value)
+ if not ok and errors then
+ raise(errors)
+ end
+ return ok
+end
+
-- bind socket
function sandbox_core_base_socket_instance.bind(sock, addr, port)
local ok, errors = sock:_bind(addr, port)