summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-10-27 21:19:00 +0800
committerruki <[email protected]>2019-10-27 21:33:01 +0800
commitecc9fe93d544669f6ae5c8261c7e3e4601a11a26 (patch)
treee22be0cdb7c1db7856b0c4d80c073cb1313d9c2a
parent239d4dead77af769ba5adccb58f30e9d52238adc (diff)
improve socket recv
-rw-r--r--tests/modules/socket/tcp/echo_client.lua2
-rw-r--r--tests/modules/socket/tcp/echo_server.lua2
-rw-r--r--xmake/core/base/socket.lua37
-rw-r--r--xmake/core/sandbox/modules/import/core/base/socket.lua4
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