determining network connection status
Dar Scott
dsc at swcp.com
Wed Jul 30 14:57:00 EDT 2003
On Wednesday, July 30, 2003, at 01:05 PM, Eric Peden wrote:
> Currently, I simply "get URL" a page on our web server and, if the
> result
> is empty, show the "not connected" message. However, this has a couple
> of problems:
>
> 1) There's often a significant timeout delay when the network is
> unavailable, sometimes 10 or 15 seconds. I'd like to let the user
> know
> more quickly what the problem is.
This can be 75 seconds on OS X and 21 seconds on W2K and XP.
>
> 2) I can't distinguish between a "no network" error and a timeout
> error.
> Ideally, I'd let the user know the problem is not their fault if I
> get a timeout, but since I'm also relying on a timeout to tell me if
> the network is not available, I can't provide a specific error
> message.
>
> I could fix (1) by opening a socket with a shorter timeout value, but
> that still doesn't address (2). Any ideas?
Your idea of simply opening a socket rather than 'get URL' is a better
way to go. The socketTimeout does not apply to open, so you will have
to chase after it with a send to cancel the open (close) and declare a
timeout. If you are using a blocking style (not using 'with message')
there still might be a way.
For #2, you can provide a generic error message "Cannot connect to
Eric's server!" I know this doesn't address your desire, but it might
be the only way to go. Another approach is to add a step that (among
other things, perhaps) instructs the user to make sure the computer is
connected to the Internet. That can avoid any surprise dialing
problems.
Part of the problem is what "no network" means. Does it mean the user
did not dial up the ISP? Does it mean the cable to the Ethernet card
is not connected? Would it apply to the case where the user is
connected to the local LAN but the gateway to the Internet is down?
Does it mean that TCP/IP is not even set up on the computer? To detect
that a computer can reach the internet whether or not the LAN is up
requires trying to.
You can check result() on the open. That can catch a lot of local
problems.
If you mean access to the Internet, then one method is to open a tcp
link to a reliable related Internet computer by IP address and then
close that. If there is a chance the client is behind a firewall, it
may need to be port 80. Maybe the user can set up an address or name
that can be used for checking this.
You might explore a couple ideas related to DNS. If DNSServers()
returns empty, then the computer is not connected to the Internet, but
if not then you don't know. You might try a query with
hostNameToAddress(), but that might be cached, either on the local
computer on on a LAN DNS server. _If_ DNSServers() returns a public IP
Address, you can try to open DNS with tcp, however, some locations
limit DNS to udp. You might opening to _your_ DNS sever.
You might try ping with shell().
If your server computer is up, but the service is down, then the open
will be refused. If you use 'with message' you will get a socketError
callback on Windows and a socketClose on OS X. I think you also get it
without the 'with message'; I so rarely use blocking I/O, I don't
remember. You can use that as a distinction. Windows will delay this
for 9 seconds.
Dar Scott
More information about the use-livecode
mailing list