Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] Re: UDP Multicast to TCP

From: petr:krenzelok:seznam:cz at: 18-Nov-2009 7:41

Hello, here's my "multiserver" script, which I did for my friend, it is also well commented. You need to experiment along the lines of creating a wait-list. Events might happen both on the already established connection side, as well as on the listener side. You need to "wait" to all of those. And to not block, you can put also time into wait list. So if there is no event on your ports, you get interrupted by the time event. My script is async, non blocking .... -------------------------------------- REBOL [ Title: "Multiserver" Version: 0.2 Author: "Petr Krenzelok" ] ;--- open listen server in an async manner listen-port: 9005 server: open/direct/no-wait/binary join tcp://: listen-port print ["Server running on port: " listen-port] ;--- set-up a wait-list - rebol will wait for every item contained ... wait-list: copy [] ;--- set-up a block to store open connections in there ... ;--- along with info - remote IP, port ... conn-list: copy [] ;--- insert time and server into wait-list insert wait-list 0.001 insert wait-list server ;--- forever= endless loop .... forever [ event-port: wait wait-list ;--- if more events, let's pick first one (maybe not needed?) if block? event-port [event-port: first event-port] ;--- has event happened on our listening server? (new connection request) ;--- if so, accept an event, insert the connection into wait-list if event-port == server [ ;--- accept connection ... time: now/time/precise connection: first server print join "New connection from: " [connection/remote-ip ":" connection/remote-port " at " time] ;--- append it into list of ports we wait for events to happen on (wait-list) insert wait-list connection ;--- append into our internal register of connections and its parameters insert conn-list reduce [connection connection/remote-ip connection/remote-port] write/append join %data- reduce [connection/remote-ip "-" connection/remote-port".txt"] join "New connection from: " [ connection/remote-ip ":" connection/remote-port " at " time newline "---------------------------------------------------------" newline ] ;--- uncomment to see the data in console ... ;probe connection ] ;--- if event received is not new connection, it might be data on already existing connection if found? conn-port: find conn-list event-port [ ;--- let's copy data ... time: now/time/precise data: copy event-port ;--- close request (none) or real data arriving? either none? data [ print join "Closing connection request from: " [conn-port/2 ":" conn-port/3 " at " time] ;--- Write close even request into file ... write/append join %data- reduce [conn-port/2 "-" conn-port/3 ".txt"] join newline [ "---------------------------------------------------------" newline "Closing connection request from: " conn-port/2 ":" conn-port/3 " at " time newline newline "=========================================================" newline newline ] close event-port remove/part conn-port 3 ][ ;--- if we are here, real data arrived ... print join "Data from: " [conn-port/2 ":" conn-port/3 " at " time] ;--- write data into file ... write/append join %data- reduce [conn-port/2 "-" conn-port/3 .txt ] to-string data ;--- uncomment to see data printed to console ;print mold to-string data ;print mold data ; data as binary, not string ] ;end 'either ] ;end 'if ] ;end 'forever