Skip to content

Commit 793fa4a

Browse files
committed
更新 bee.net
1 parent 0b2e822 commit 793fa4a

File tree

2 files changed

+120
-123
lines changed

2 files changed

+120
-123
lines changed

script/meta/bee/socket.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@
88
---| 'udp6'
99

1010
---@class bee.socket
11-
---@overload fun(protocol: bee.socket.protocol): bee.socket.fd?, string?
1211
local socket = {}
1312

13+
---@param protocol bee.socket.protocol
14+
---@return bee.socket.fd?
15+
---@return string?
16+
function socket.create(protocol) end
17+
1418
---@param readfds? bee.socket.fd[]
1519
---@param writefds? bee.socket.fd[]
1620
---@param timeout number

script/service/net.lua

Lines changed: 115 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
local socket = require "bee.socket"
22
local select = require "bee.select"
3+
local fs = require "bee.filesystem"
4+
35
local selector = select.create()
46
local SELECT_READ <const> = select.SELECT_READ
57
local SELECT_WRITE <const> = select.SELECT_WRITE
@@ -39,7 +41,7 @@ end
3941
local function on_event(self, name, ...)
4042
local f = self._event[name]
4143
if f then
42-
f(self, ...)
44+
return f(self, ...)
4345
end
4446
end
4547

@@ -90,69 +92,31 @@ local function close_write(self)
9092
close(self)
9193
end
9294
end
93-
function stream:select_r()
94-
local data = self._fd:recv()
95-
if data == nil then
96-
self:close()
97-
elseif data == false then
98-
else
99-
on_event(self, "data", data)
100-
end
101-
end
102-
function stream:select_w()
103-
local n = self._fd:send(self._writebuf)
104-
if n == nil then
105-
self.shutdown_w = true
106-
close_write(self)
107-
elseif n == false then
108-
else
109-
self._writebuf = self._writebuf:sub(n + 1)
110-
if self._writebuf == "" then
111-
close_write(self)
112-
end
113-
end
114-
end
11595
local function update_stream(s, event)
11696
if event & SELECT_READ ~= 0 then
117-
s:select_r()
97+
local data = s._fd:recv()
98+
if data == nil then
99+
s:close()
100+
elseif data == false then
101+
else
102+
on_event(s, "data", data)
103+
end
118104
end
119105
if event & SELECT_WRITE ~= 0 then
120-
s:select_w()
121-
end
122-
end
123-
124-
local function accept_stream(fd)
125-
local s = setmetatable({
126-
_fd = fd,
127-
_flags = SELECT_READ,
128-
_event = {},
129-
_writebuf = "",
130-
shutdown_r = false,
131-
shutdown_w = false,
132-
}, stream_mt)
133-
selector:event_add(fd, SELECT_READ, function (event)
134-
update_stream(s, event)
135-
end)
136-
return s
137-
end
138-
local function connect_stream(s)
139-
setmetatable(s, stream_mt)
140-
selector:event_del(s._fd)
141-
if s._writebuf ~= "" then
142-
s._flags = SELECT_READ | SELECT_WRITE
143-
selector:event_add(s._fd, SELECT_READ | SELECT_WRITE, function (event)
144-
update_stream(s, event)
145-
end)
146-
s:select_w()
147-
else
148-
s._flags = SELECT_READ
149-
selector:event_add(s._fd, SELECT_READ, function (event)
150-
update_stream(s, event)
151-
end)
106+
local n = s._fd:send(s._writebuf)
107+
if n == nil then
108+
s.shutdown_w = true
109+
close_write(s)
110+
elseif n == false then
111+
else
112+
s._writebuf = s._writebuf:sub(n + 1)
113+
if s._writebuf == "" then
114+
close_write(s)
115+
end
116+
end
152117
end
153118
end
154119

155-
156120
local listen_mt = {}
157121
local listen = {}
158122
listen_mt.__index = listen
@@ -168,32 +132,6 @@ function listen:close()
168132
self.shutdown_r = true
169133
close(self)
170134
end
171-
local function new_listen(fd)
172-
local s = {
173-
_fd = fd,
174-
_flags = SELECT_READ,
175-
_event = {},
176-
shutdown_r = false,
177-
shutdown_w = true,
178-
}
179-
selector:event_add(fd, SELECT_READ, function ()
180-
local newfd, err = fd:accept()
181-
if not newfd then
182-
on_event(s, "error", err)
183-
return
184-
end
185-
local ok, err = newfd:status()
186-
if not ok then
187-
on_event(s, "error", err)
188-
return
189-
end
190-
if newfd:status() then
191-
local news = accept_stream(newfd)
192-
on_event(s, "accept", news)
193-
end
194-
end)
195-
return setmetatable(s, listen_mt)
196-
end
197135

198136
local connect_mt = {}
199137
local connect = {}
@@ -216,7 +154,84 @@ function connect:close()
216154
self.shutdown_w = true
217155
close(self)
218156
end
219-
local function new_connect(fd)
157+
158+
local m = {}
159+
160+
function m.listen(protocol, address, port)
161+
local fd; do
162+
local err
163+
fd, err = socket.create(protocol)
164+
if not fd then
165+
return nil, err
166+
end
167+
if protocol == "unix" then
168+
fs.remove(address)
169+
end
170+
end
171+
do
172+
local ok, err = fd:bind(address, port)
173+
if not ok then
174+
fd:close()
175+
return nil, err
176+
end
177+
end
178+
do
179+
local ok, err = fd:listen()
180+
if not ok then
181+
fd:close()
182+
return nil, err
183+
end
184+
end
185+
local s = {
186+
_fd = fd,
187+
_flags = SELECT_READ,
188+
_event = {},
189+
shutdown_r = false,
190+
shutdown_w = true,
191+
}
192+
selector:event_add(fd, SELECT_READ, function ()
193+
local new_fd, err = fd:accept()
194+
if new_fd == nil then
195+
fd:close()
196+
on_event(s, "error", err)
197+
return
198+
elseif new_fd == false then
199+
else
200+
local new_s = setmetatable({
201+
_fd = new_fd,
202+
_flags = SELECT_READ,
203+
_event = {},
204+
_writebuf = "",
205+
shutdown_r = false,
206+
shutdown_w = false,
207+
}, stream_mt)
208+
if on_event(s, "accepted", new_s) then
209+
selector:event_add(new_fd, new_s._flags, function (event)
210+
update_stream(new_s, event)
211+
end)
212+
else
213+
new_fd:close()
214+
end
215+
end
216+
end)
217+
return setmetatable(s, listen_mt)
218+
end
219+
220+
function m.connect(protocol, address, port)
221+
local fd; do
222+
local err
223+
fd, err = socket.create(protocol)
224+
if not fd then
225+
return nil, err
226+
end
227+
end
228+
do
229+
local ok, err = fd:connect(address, port)
230+
if ok == nil then
231+
fd:close()
232+
return nil, err
233+
end
234+
end
220235
local s = {
221236
_fd = fd,
222237
_flags = SELECT_WRITE,
@@ -228,51 +243,29 @@ local function new_connect(fd)
228243
selector:event_add(fd, SELECT_WRITE, function ()
229244
local ok, err = fd:status()
230245
if ok then
231-
connect_stream(s)
232-
on_event(s, "connect")
246+
on_event(s, "connected")
247+
setmetatable(s, stream_mt)
248+
if s._writebuf ~= "" then
249+
update_stream(s, SELECT_WRITE)
250+
if s._writebuf ~= "" then
251+
s._flags = SELECT_READ | SELECT_WRITE
252+
else
253+
s._flags = SELECT_READ
254+
end
255+
else
256+
s._flags = SELECT_READ
257+
end
258+
selector:event_add(s._fd, s._flags, function (event)
259+
update_stream(s, event)
260+
end)
233261
else
234-
on_event(s, "error", err)
235262
s:close()
263+
on_event(s, "error", err)
236264
end
237265
end)
238266
return setmetatable(s, connect_mt)
239267
end
240268

241-
local m = {}
242-
243-
function m.listen(protocol, ...)
244-
local fd, err = socket(protocol)
245-
if not fd then
246-
return nil, err
247-
end
248-
local ok
249-
ok, err = fd:bind(...)
250-
if not ok then
251-
fd:close()
252-
return nil, err
253-
end
254-
ok, err = fd:listen()
255-
if not ok then
256-
fd:close()
257-
return nil, err
258-
end
259-
return new_listen(fd)
260-
end
261-
262-
function m.connect(protocol, ...)
263-
local fd, err = socket(protocol)
264-
if not fd then
265-
return nil, err
266-
end
267-
local ok
268-
ok, err = fd:connect(...)
269-
if ok == nil then
270-
fd:close()
271-
return nil, err
272-
end
273-
return new_connect(fd)
274-
end
275-
276269
function m.update(timeout)
277270
for func, event in selector:wait(timeout or 0) do
278271
func(event)

0 commit comments

Comments
 (0)