Page 1 of 1
net-connect question
Posted: Mon Aug 08, 2005 1:57 am
by sprink
Hi, i'm fairly new to newlisp so I thought i''d make a script to validate if a list of anonymous proxy servers in a file are connectable (seems easy enough), but my script seems to stall on the ones that aren't. Here's my code:
Code: Select all
(define (check-list file)
(set 'in-file (open file "read"))
(while
(read-line in-file)
(check-state (current-line))
)
(close in-file)
)
(define (check-state server)
(if
(= (net-connect server 8080) nil)
(println (current-line) " is NOT online")
(println (current-line) " is online")
)
)
(check-list "servers.txt")
(exit)
Is there some way to set like a timeout limit on the net-connect so it doesn't hang for ever on the ones that aren't connectable?
i.e. So it can scan a list of ips and quickly tell which are useable.
Posted: Mon Aug 08, 2005 10:15 am
by pjot
Hi,
This question has been asked before:
---------------
http://www.alh.net/newlisp/phpbb/viewtopic.php?t=685
---------------
Maybe it's better to perform a 'ping' first, to check if the proxyserver is online. If the proxyserver is out of your network segment and not routed then even the ping will not return.
Peter
Posted: Mon Aug 08, 2005 11:32 am
by Dmi
How about calling "nmap" with list of hosts/ports and parsing it's output.
Yes, nmap isn't part of newLisp, but instead it designed to scan ports ;-)
The code will looks like "Get a list of local IPs" in "code snippets" page
Posted: Mon Aug 08, 2005 7:23 pm
by newdep
The ones that arn't connectable will directly return 'nil and wont
hang the session. Those who can will return a handle, but a handle does
not say its accessable..!
this is quick enough.. not too fast but it works..without hangs..
http://www.nodep.nl/downloads/newlisp/portscan.lsp
Try to send someting or read someting for the handle with a (net-select..)
Norman.
Posted: Mon Aug 08, 2005 10:14 pm
by sprink
well, first off, thanks for the replys. But I still haven't quite got the solution i'm looking for working. From your replys i'm assuming my best bet is to use threads for each connection (so I can continue to check the rest without waiting for timeouts)
or use net-select. But I can't seem to get net-select to work the way it says in the manual.
This is my little script updated from the last version, trying to implement the net-select function.
Code: Select all
(define (check-list file)
(set 'in-file (open file "read"))
(while
(read-line in-file)
(check-state (current-line))
)
(close in-file)
)
(define (check-state server)
(if (= (net-lookup server) nil)
(println (current-line) " does not resolve.")
(begin
(set 'sock (net-connect server 8080))
(if (= (net-select sock "write" 1000) nil)
(begin
(println (current-line) " is not connectable on port 8080.")
(net-close sock))
(begin
(println (current-line) " connection made.")
(net-close sock))
)
)
)
)
(if (= (main-args 2) nil)
(begin
(println "Please supply a proxy list as a argument.")
(exit)
)
)
(check-list (main-args 2))
(exit)
from reading the manaul net-select looks like it should return either true or nil after the 1000 mili-seconds. Am I mistaken or am I using net-select the wrong way?
Posted: Mon Aug 08, 2005 11:25 pm
by Dmi
what is the advantage of this script?
net-connect is bloking either, so, if port is filtered out by "drop" policy (as usual :) it will not return anything until long timeout.
So, if U still want to use net-connect, threads will be a good choice.
btw, nil in newLisp is equivalent of "false", and
(if (= (net-lookup server) nil) ...
is equivalent to
(if (net-lookup server) ...
Posted: Mon Aug 08, 2005 11:38 pm
by sprink
Dmi wrote:
btw, nil in newLisp is equivalent of "false", and
(if (= (net-lookup server) nil) ...
is equivalent to
(if (net-lookup server) ...
(if (net-lookip server))
isn't equivalent to
(if (= (net-lookup server) nil).
perhaps you mean !=
And newdep suggested using net-select, which seems like the easier route. That's why I decided to try and use it.
Posted: Tue Aug 09, 2005 12:02 am
by Dmi
... about nil: of course !=
about select: net-select operates on descriptor, given from net-connect (or net-listen, but it's not our case).
It's in your code:
Code: Select all
(set 'sock (net-connect server 8080))
(if (= (net-select sock "write" 1000) nil)
But net-connect blocks on filtered ports (I just have checked for that).
So, net-select runs always _after_ net-connect, and after it's timeout.
Posted: Tue Aug 09, 2005 12:05 am
by sprink
ohhhhh. hehe Dmi. I understand now. Thanks for clearing that up. :)
Posted: Tue Aug 09, 2005 1:31 pm
by newdep
A net-select on a net-connect is always true for "r" "w" "a" on a opened socket! That wont help in this case..
Norman.