John Craig wrote:
Is it possible for rev to determine the local port used to send udp data?
I don't know of a way to do this directly - certainly nothing I can see
in the docs, and haven't seen it done.
There is a pretty nasty (but generally effective) way to do it ..... see
below. But before you get to that, I have to ask *why* you want to know
this. I can think of lots of possible reasons - but most of them aren't
good reasons. Generally, you don't need to know which local port has
been used - the handler specified in the "open" statement receives a
message when any reply arrives, without needing to know the port number.
There are good reasons to want it, but all the ones I can think of are
pretty esoteric (e.g. to punch a hole through a firewall). So I am
curious why you want this, in case we can suggest a better way.
Icky work-around.
All major OSes (afaik) allocate local ports serially, so you can pretty
much determine what was allocated by
- accept udp packets on some loopback interface (e.g. 127.0.0.1:9876)
- open a "connection" to this interface, send a packet to the
connection, close the connection
- give message processing a chance to happen
- open the socket you *really* wanted
- open a "connection" to this interface, send a packet to the
connection, close the connection
- give message processing a chance to happen again
Each time the loopback receives a packet, it can look at the incoming
socket info (which contains the return port number)
These *should* differ by two (assuming the OS allocated serially, and
nothing else got in the way).
If they differ by something other than 2 - try again !?!
Here's some code I tried out just to check if that does actually work,
and it does seem to ...
--> all handlers
on mouseUp
-- use a 192.168.1.1 address (i.e. NOT same machine) to avoid
error of no-one accepting on this port
put "opened" && getUDPLOcalSocket("191.168.1.1:4567", myCallBack)
& cr after msg
-- put "before write " && the opensockets & cr after msg
-- write "one" && cr to socket "127.0.0.1:4567"
-- put "after write " && the opensockets & cr after msg
end mouseUp
on myCallBack
-- will only be called if there is, e.g., an echo server on the
"real" socket
-- and if the above three lines are uncommented ...
put "real call back handler ---------" & cr & paramCount() & cr
after msg
repeat with i = 1 to paramCount()
put i && ":" && param(i) & cr after msg
end repeat
put "end real call back handler ---------" & cr after msg
end myCallback
local lIncomingSocketList
local lLoopBackSocket = "127.0.0.1:9876"
function getUDPLocalSocket pSocket, pCallBack
-- first zero the accumulator
put empty into lIncomingSocketList
-- and close the socket (if it's alreadyh open, would re-use same
local port number
close socket pSocket
-- set up the loopback, write to and close
accept datagram connections on port "9876" with message loopBack
open datagram socket lLoopBackSocket with message loopBack
write " " to socket lLoopBackSocket
close socket lLoopBackSocket
-- MUST give that a chance to happen !
wait 5 millisecs with messages
open datagram socket pSocket with message pCallBack
-- repeat the loopback open/write/close/allow messages
open datagram socket lLoopBackSocket with message loopBack
write " " to socket lLoopBackSocket
close socket lLoopBackSocket
wait 5 millisecs with messages
-- and now can return the list - should have two port numbers 2 apart
return lIncomingSocketList
end getUDPLocalSocket
on loopBack pSock
put pSock & comma after lIncomingSocketList
put "lopback" && pSock &cr after msg
end loopBack
on socketError p
put "error" && p after msg
end socketError
--
Alex Tweedly http://www.tweedly.net
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.394 / Virus Database: 268.9.8/380 - Release Date: 30/06/2006
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution