diff options
| author | ruki <[email protected]> | 2019-10-27 21:19:00 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-10-27 21:33:01 +0800 |
| commit | ecc9fe93d544669f6ae5c8261c7e3e4601a11a26 (patch) | |
| tree | e22be0cdb7c1db7856b0c4d80c073cb1313d9c2a | |
| parent | 239d4dead77af769ba5adccb58f30e9d52238adc (diff) | |
improve socket recv
| -rw-r--r-- | tests/modules/socket/tcp/echo_client.lua | 2 | ||||
| -rw-r--r-- | tests/modules/socket/tcp/echo_server.lua | 2 | ||||
| -rw-r--r-- | xmake/core/base/socket.lua | 37 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/core/base/socket.lua | 4 |
4 files changed, 35 insertions, 10 deletions
diff --git a/tests/modules/socket/tcp/echo_client.lua b/tests/modules/socket/tcp/echo_client.lua index 28c242bb1..d2409a210 100644 --- a/tests/modules/socket/tcp/echo_client.lua +++ b/tests/modules/socket/tcp/echo_client.lua @@ -6,7 +6,7 @@ function main() print("connect %s:%d ..", addr, port) local sock = socket.connect(addr, port) print("%s: connected!", sock) - local send = sock:send("hello") + local send = sock:send("hello world..") print("%s: send %d", sock, send) sock:close() end diff --git a/tests/modules/socket/tcp/echo_server.lua b/tests/modules/socket/tcp/echo_server.lua index 58e1956c1..48f22a977 100644 --- a/tests/modules/socket/tcp/echo_server.lua +++ b/tests/modules/socket/tcp/echo_server.lua @@ -11,7 +11,7 @@ function main() local sock_client = sock:accept() if sock_client then print("%s: accepted", sock_client) - local recv, data = sock_client:recv(8192) + local recv, data = sock_client:recv(13, {block = true}) print("%s: recv %d, data: %s", sock_client, recv, data or "") sock_client:close() end diff --git a/xmake/core/base/socket.lua b/xmake/core/base/socket.lua index 971885e6e..edf8c6a44 100644 --- a/xmake/core/base/socket.lua +++ b/xmake/core/base/socket.lua @@ -127,7 +127,7 @@ function _instance:accept(opt) if not sock and not errors then opt = opt or {} local events, waiterrs = self:wait(socket.EV_ACPT, opt.timeout or -1) - if events == socket.EV_CONN then + if events == socket.EV_ACPT then sock, errors = io.socket_accept(self._SOCK) else errors = waiterrs @@ -186,7 +186,7 @@ function _instance:send(data, start, last) end -- recv data from socket -function _instance:recv(size) +function _instance:recv(size, opt) -- ensure opened local ok, errors = self:_ensure_opened() @@ -195,11 +195,36 @@ function _instance:recv(size) end -- recv it - 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) + opt = opt or {} + local recv = 0 + local real = 0 + local wait = false + local data_or_errors = nil + if opt.block then + while recv < size do + real, data_or_errors = io.socket_recv(self._SOCK, size - recv) + if real > 0 then + recv = recv + real + wait = false + elseif real == 0 and not wait then + local events, waiterrs = self:wait(socket.EV_RECV, opt.timeout or -1) + if events == socket.EV_RECV then + wait = true + else + data_or_errors = waiterrs + break + end + else + break + end + end + else + recv, data_or_errors = io.socket_recv(self._SOCK, size) + if recv < 0 and data_or_errors then + data_or_errors = string.format("%s: %s", self, data_or_errors) + end end - return real, data_or_errors + return recv, 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 6090e52b1..3220837e9 100644 --- a/xmake/core/sandbox/modules/import/core/base/socket.lua +++ b/xmake/core/sandbox/modules/import/core/base/socket.lua @@ -115,8 +115,8 @@ function sandbox_core_base_socket_instance.send(sock, data, start, last) end -- recv data from socket -function sandbox_core_base_socket_instance.recv(sock, size) - local real, data_or_errors = sock:_recv(data, size) +function sandbox_core_base_socket_instance.recv(sock, size, opt) + local real, data_or_errors = sock:_recv(size, opt) if real < 0 and data_or_errors then raise(data_or_errors) end |
