25
25
## invalidate any other reasons why the executable file might be covered by
26
26
## the GNU General Public License.
27
27
28
- from socket import AF_INET , SOCK_DGRAM , SOL_SOCKET , SO_REUSEADDR # SO_ERROR
28
+ from socket import AF_INET , SOCK_DGRAM , SOL_SOCKET , SO_REUSEADDR , SO_BROADCAST # SO_ERROR
29
29
from socket import gethostname
30
30
from select import select
31
31
import utils , socket
@@ -126,6 +126,12 @@ def send_end(self):
126
126
self .curr_txmeta = None
127
127
return True
128
128
129
+ def set_broadcast (self , v ):
130
+ if v :
131
+ self .sock .setsockopt (SOL_SOCKET , SO_BROADCAST , 1 )
132
+ else :
133
+ self .sock .setsockopt (SOL_SOCKET , SO_BROADCAST , 0 )
134
+
129
135
def close (self ):
130
136
self .sock .close ()
131
137
self .opened = False
@@ -187,11 +193,25 @@ def run(self, data):
187
193
if sock is None :
188
194
return chr (0 )
189
195
port = (ord (data [1 ]) << 8 ) + ord (data [2 ])
196
+ sock .set_broadcast (False )
190
197
if sock .send_start (data [3 :], port ) is None :
191
198
return chr (0 )
192
199
else :
193
200
return chr (1 )
194
201
202
+ class WRITE_BEGIN_BROADCAST_Command :
203
+ def run (self , data ):
204
+ id = ord (data [0 ])
205
+ sock = udp_sockets .get (id )
206
+ if sock is None :
207
+ return chr (0 )
208
+ port = (ord (data [1 ]) << 8 ) + ord (data [2 ])
209
+ sock .set_broadcast (True )
210
+ if sock .send_start ('<broadcast>' , port ) is None :
211
+ return chr (0 )
212
+ else :
213
+ return chr (1 )
214
+
195
215
class WRITE_Command :
196
216
def run (self , data ):
197
217
id = ord (data [0 ])
@@ -271,6 +291,7 @@ def run(self, data):
271
291
272
292
def init (command_processor ):
273
293
command_processor .register ('e' , CREATE_Command ())
294
+ command_processor .register ('v' , WRITE_BEGIN_BROADCAST_Command ())
274
295
command_processor .register ('E' , WRITE_BEGIN_Command ())
275
296
command_processor .register ('h' , WRITE_Command ())
276
297
command_processor .register ('H' , WRITE_END_Command ())
@@ -285,6 +306,11 @@ def test():
285
306
from time import sleep
286
307
import struct
287
308
udp = UDPSocket ('' , 5555 )
309
+ udp .set_broadcast (True )
310
+ udp .send_start ('<broadcast>' , 5555 )
311
+ udp .send ('hi' )
312
+ udp .send_end ()
313
+ udp .set_broadcast (False )
288
314
while True :
289
315
udp .run ()
290
316
sleep (0.1 )
0 commit comments