Socket timeout not working with libUrl
frank at backtalk.com
Mon Jan 31 05:11:49 EST 2005
Thanks for the reply.
After a lot of testing on Mac OS X, I've found that the problem I was
having appears to be due to the way that Mac OS X does DNS lookups.
Whether or not it's a RunRev bug as well is hard to tell, but I think
it might be.
Here's some sample code I wrote. This code sends a "My5SecondTimeout"
message to itself, opens a socket, makes an HTTP GET request, waits for
the response, and closes the socket. (Note: I had to use this
"My5SecondTimeout" message because setting the socketTimeoutInterval
doesn't seem to work).
When you run this script and you're not connected to the internet
here's what happens:
1) If I open the socket with an ip address, e.g. 188.8.131.52, my 5
second timer will fire, and I can close the socket and exit from the
2) If I open the socket with a domain address, e.g.
www.webphotospro.com, Mac OS X does a DNS lookup, puts up the rainbow
rotating color cursor, and hangs until the DNS lookup fails. On my
machine this takes 60 seconds (apparently it's dependent on how many
dns servers you have listed).
I'm guessing this is a RunRev bug, but I can't be sure. Basically
RunRev hangs for 60 seconds while the DNS lookup takes place during the
"open socket" call -- it doesn't send a socket timeout, and it doesn't
the "My5SecondTimeout" message either.
Can confirm this?
set the socketTimeoutInterval to 5000 -- this seems to do nothing,
but set it anyway
global theIp, socketIsOpen, socketTimedOut
put "www.webphotospro.com:80" into theIp -- using this causes RunRev
to hang for 60 seconds
-- put "184.108.40.206:80" into theIp -- using this does not cause a
put false into socketIsOpen
put false into socketTimedOut
send "My5SecondTimeout" to button "Ping" in 5 seconds -- send a
message to myself
close socket theIp -- in case it's currently open
open socket to theIp with message "mySocketOpenMsg"
wait until socketIsOpen or socketTimedOut with messages
if socketTimedOut then
close socket theIp
answer "socket timed out"
global socketIsOpen, socketTimedOut
if not socketIsOpen then
put true into socketTimedOut
on mySocketOpenMsg theParams
global theIp, socketIsOpen
put true into socketIsOpen
write "GET / HTTP/1.0" & numToChar(13) & numToChar(10) &
numToChar(13) & numToChar(10) to socket theIp
read from socket theIp for 50 with message "mySocketReadDoneMsg"
on mySocketReadDoneMsg socketId, theData
close socket theIp
answer "read done: " & socketId && theData
Web Photos Pro: Software for Photo Bloggers and Other Photo Power Users
See us on the web at http://www.webphotospro.com/
On Jan 31, 2005, at 1:16 AM, use-revolution-request at lists.runrev.com
> From: Sarah Reichelt <sarahr at genesearch.com.au>
> Subject: Re: Socket timeout not working with libUrl
> To: How to use Revolution <use-revolution at lists.runrev.com>
> Message-ID: <3A70EDD2-7316-11D9-819B-0003937A97B8 at genesearch.com.au>
> Content-Type: text/plain; charset=US-ASCII; format=flowed
>> My product pings the Web Photos Pro website to look for new versions.
>> This works great when the computer the product's running on is
>> connected to the internet, but it hangs for 60 seconds when there's no
>> net connection.
>> My code looks like this:
>> set the socketTimeoutInterval to 5000
>> put URL (getPhotoAlbumUrl() & "downloads/version_info.php") into
>> Is there any way I can force a timeout after 5 seconds? Should I be
>> using a non-blocking URL request? Should I be attempting to open a
>> socket directly to do an initial "am I connected to the internet?"
>> request, before making the URL request?
> Hi Frank,
> I would definitely use a non-blocking request, so the user won't even
> notice if it is trying & failing.
> Try something like:
> set the socketTimeoutInterval to 5000
> put (getPhotoAlbumUrl() & "downloads/version_info.php") into tURL
> load tURL with message gotVersion
> Then you need a "gotVersion" handler in the same object:
> on gotVersion
> put URL (getPhotoAlbumUrl() & "downloads/version_info.php") into
> -- check newVersion & do the usual stuff
> end gotVersion
> Hope this helps,
More information about the Use-livecode