KL 2008-05-02: This example script executed as client scans the IP address range 192.168.0.2 to 192.168.0.255 for an server (which is the same script executed as server) If you use windows XP with SP2 (or Vista) this script won't work correctly if the server IP is larger than 192.168.0.10 (e.g. 192.168.0.11). See socket for reasons.
Principle
Code
proc scan_ip {start_ip end_ip} { global globals set curr_ip 192.168.0.$start_ip set end_ip_section 192.168.0.$end_ip while {$curr_ip != $end_ip_section} { #open the whole bunch of sockets (normally 255) if {![catch {set sock [socket -async $curr_ip $globals(client_server_port)]}]} { fconfigure $sock -blocking 0 -buffering line append ip_list "$sock $curr_ip " puts "testing:$curr_ip" } incr start_ip set curr_ip 192.168.0.$start_ip } after 100 #check the successfully opened sockets if there is an server behind foreach {sock curr_ip} $ip_list { set test "" catch {set test [gets $sock] } if {$test == "SERVER_OK" } { set ret_ip $curr_ip puts "SUCCESS: Found server at: $curr_ip" break } } #close sockets again foreach {sock curr_ip} $ip_list { close $sock } } proc Configure_Server_Client {sock addr port} { global globals # Record the client's information fconfigure $sock -blocking 0 -buffering line # Set up a event if data is present at admin socket if {[catch {puts $sock "SERVER_OK"}]} { puts "remote gui socket not available anymore closing sock: $sock" close $sock return } ##for this check all is done I close the socket again close $sock puts "successfully etablished connection to client" exit } ###MAIN######## if {$argc != 1} { puts "usage:[file tail $argv0] <server|client>" exit } set globals(client_server_port) 9901 switch $argv { server { puts "opening server socket at port $globals(client_server_port)" socket -server Configure_Server_Client $globals(client_server_port) vwait forever } client { scan_ip 2 255 }