1
- local udp = {}
1
+ local ut0311 = {}
2
2
local socket = require (" socket" )
3
3
local READ <const> = 5 -- seconds
4
4
local READALL <const> = 2.5 -- seconds
@@ -11,7 +11,7 @@ local broadcast_port = 60000
11
11
local listen_address = " *"
12
12
local listen_port = 60001
13
13
14
- function udp .set_bind_address (addr )
14
+ function ut0311 .set_bind_address (addr )
15
15
if not addr or addr == " " then
16
16
bind_address = " *"
17
17
bind_port = 0
@@ -31,7 +31,7 @@ function udp.set_bind_address(addr)
31
31
end
32
32
end
33
33
34
- function udp .set_broadcast_address (addr )
34
+ function ut0311 .set_broadcast_address (addr )
35
35
if not addr or addr == " " then
36
36
broadcast_address = " 255.255.255.255"
37
37
broadcast_port = 60000
@@ -51,7 +51,7 @@ function udp.set_broadcast_address(addr)
51
51
end
52
52
end
53
53
54
- function udp .set_listen_address (addr )
54
+ function ut0311 .set_listen_address (addr )
55
55
if not addr or addr == " " then
56
56
listen_address = " *"
57
57
listen_port = 60001
@@ -71,11 +71,11 @@ function udp.set_listen_address(addr)
71
71
end
72
72
end
73
73
74
- function udp .set_debug (enabled )
74
+ function ut0311 .set_debug (enabled )
75
75
debug = enabled
76
76
end
77
77
78
- function udp .broadcast (request )
78
+ function ut0311 .broadcast (request )
79
79
local sock = socket .udp4 ()
80
80
local ok , result = pcall (function ()
81
81
return broadcast (sock , request )
@@ -90,22 +90,19 @@ function udp.broadcast(request)
90
90
end
91
91
end
92
92
93
- function udp .send (request )
94
- local sock = socket .udp4 ()
95
- local ok , result = pcall (function ()
96
- return send (sock , request )
97
- end )
98
-
99
- sock :close ()
100
-
101
- if not ok then
102
- error (result )
103
- else
104
- return result
93
+ function ut0311 .send (controller , request )
94
+ if controller [' address' ] ~= " " and controller [' transport' ] == " tcp" then
95
+ return tcp_sendto (controller [' address' ], request )
96
+ end
97
+
98
+ if controller [' address' ] ~= " " then
99
+ return udp_sendto (controller [' address' ], request )
105
100
end
101
+
102
+ return udp_broadcast_to (request )
106
103
end
107
104
108
- function udp .listen (handler )
105
+ function ut0311 .listen (handler )
109
106
local f = function (packet )
110
107
dump (packet )
111
108
handler (packet )
@@ -144,6 +141,92 @@ function broadcast(sock, request)
144
141
return read_all (sock )
145
142
end
146
143
144
+ function udp_broadcast_to (request )
145
+ local sock = socket .udp4 ()
146
+ local ok , result = pcall (function ()
147
+ return send (sock , request )
148
+ end )
149
+
150
+ sock :close ()
151
+
152
+ if not ok then
153
+ error (result )
154
+ else
155
+ return result
156
+ end
157
+ end
158
+
159
+ function udp_sendto (address , request )
160
+ dump (request )
161
+
162
+ addr ,port = addrport (address )
163
+
164
+ local sock = socket .udp4 ()
165
+ local ok , result = pcall (function ()
166
+ if sock :setsockname (bind_address , 0 ) ~= 1 then
167
+ error (" error binding to address" )
168
+ end
169
+
170
+ sock :settimeout (READ , " b" )
171
+ sock :settimeout (READALL , " t" )
172
+ sock :sendto (request , addr , port )
173
+
174
+ -- set-ip doesn't return a reply
175
+ if string.byte (request , 2 ) == 0x96 then
176
+ return {}, nil
177
+ end
178
+
179
+ return read (sock )
180
+ end )
181
+
182
+ sock :close ()
183
+
184
+ if not ok then
185
+ error (result )
186
+ else
187
+ return result
188
+ end
189
+ end
190
+
191
+ function tcp_sendto (address , request )
192
+ dump (request )
193
+
194
+ addr ,port = addrport (address )
195
+
196
+ local sock = socket .tcp4 ()
197
+ local ok , result = pcall (function ()
198
+ if sock :connect (addr , port ) ~= 1 then
199
+ error (" error connecting to " , addr , port )
200
+ end
201
+
202
+ sock :settimeout (READ , " b" )
203
+ sock :settimeout (READALL , " t" )
204
+ sock :send (request )
205
+
206
+ -- set-ip doesn't return a reply
207
+ if string.byte (request , 2 ) == 0x96 then
208
+ return {}, nil
209
+ end
210
+
211
+ local packet = sock :receive (' *a' )
212
+ if packet and # packet == 64 then
213
+ dump (packet )
214
+ return packet
215
+ end
216
+
217
+
218
+ return nil
219
+ end )
220
+
221
+ sock :close ()
222
+
223
+ if not ok then
224
+ error (result )
225
+ else
226
+ return result
227
+ end
228
+ end
229
+
147
230
function send (sock , request )
148
231
dump (request )
149
232
@@ -235,6 +318,20 @@ function listen_to(sock, f)
235
318
end
236
319
end
237
320
321
+ function addrport (address )
322
+ if address and address ~= " " then
323
+ local addr , port = address :match (" ^(.-):(%d*)$" )
324
+
325
+ if addr and port and addr ~= " " and port ~= " " then
326
+ return addr , tonumber (port )
327
+ elseif addr and addr ~= " " then
328
+ return addr , 60000
329
+ end
330
+ end
331
+
332
+ return " 255.255.255.255" , 60000
333
+ end
334
+
238
335
function dump (packet )
239
336
if debug then
240
337
local ix = 1
@@ -255,4 +352,4 @@ function dump(packet)
255
352
end
256
353
end
257
354
258
- return udp
355
+ return ut0311
0 commit comments