remote.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This file contains Tcl code to implement a remote server that can be
  2. # used during testing of Tcl socket code. This server is used by some
  3. # of the tests in socket.test.
  4. #
  5. # Source this file in the remote server you are using to test Tcl against.
  6. #
  7. # Copyright (c) 1995-1996 Sun Microsystems, Inc.
  8. #
  9. # See the file "license.terms" for information on usage and redistribution
  10. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11. #
  12. # RCS: @(#) $Id: remote.tcl,v 1.3 1999/04/16 00:47:33 stanton Exp $
  13. # Initialize message delimitor
  14. # Initialize command array
  15. catch {unset command}
  16. set command(0) ""
  17. set callerSocket ""
  18. # Detect whether we should print out connection messages etc.
  19. if {![info exists VERBOSE]} {
  20.     set VERBOSE 0
  21. }
  22. proc __doCommands__ {l s} {
  23.     global callerSocket VERBOSE
  24.     if {$VERBOSE} {
  25. puts "--- Server executing the following for socket $s:"
  26. puts $l
  27. puts "---"
  28.     }
  29.     set callerSocket $s
  30.     if {[catch {uplevel #0 $l} msg]} {
  31. list error $msg
  32.     } else {
  33. list success $msg
  34.     }
  35. }
  36. proc __readAndExecute__ {s} {
  37.     global command VERBOSE
  38.     set l [gets $s]
  39.     if {[string compare $l "--Marker--Marker--Marker--"] == 0} {
  40. if {[info exists command($s)]} {
  41.     puts $s [list error incomplete_command]
  42. }
  43. puts $s "--Marker--Marker--Marker--"
  44. return
  45.     }
  46.     if {[string compare $l ""] == 0} {
  47. if {[eof $s]} {
  48.     if {$VERBOSE} {
  49. puts "Server closing $s, eof from client"
  50.     }
  51.     close $s
  52. }
  53. return
  54.     }
  55.     append command($s) $l "n"
  56.     if {[info complete $command($s)]} {
  57. set cmds $command($s)
  58. unset command($s)
  59. puts $s [__doCommands__ $cmds $s]
  60.     }
  61.     if {[eof $s]} {
  62. if {$VERBOSE} {
  63.     puts "Server closing $s, eof from client"
  64. }
  65. close $s
  66.     }
  67. }
  68. proc __accept__ {s a p} {
  69.     global VERBOSE
  70.     if {$VERBOSE} {
  71. puts "Server accepts new connection from $a:$p on $s"
  72.     }
  73.     fileevent $s readable [list __readAndExecute__ $s]
  74.     fconfigure $s -buffering line -translation crlf
  75. }
  76. set serverIsSilent 0
  77. for {set i 0} {$i < $argc} {incr i} {
  78.     if {[string compare -serverIsSilent [lindex $argv $i]] == 0} {
  79. set serverIsSilent 1
  80. break
  81.     }
  82. }
  83. if {![info exists serverPort]} {
  84.     if {[info exists env(serverPort)]} {
  85. set serverPort $env(serverPort)
  86.     }
  87. }
  88. if {![info exists serverPort]} {
  89.     for {set i 0} {$i < $argc} {incr i} {
  90. if {[string compare -port [lindex $argv $i]] == 0} {
  91.     if {$i < [expr $argc - 1]} {
  92. set serverPort [lindex $argv [expr $i + 1]]
  93.     }
  94.     break
  95. }
  96.     }
  97. }
  98. if {![info exists serverPort]} {
  99.     set serverPort 2048
  100. }
  101. if {![info exists serverAddress]} {
  102.     if {[info exists env(serverAddress)]} {
  103. set serverAddress $env(serverAddress)
  104.     }
  105. }
  106. if {![info exists serverAddress]} {
  107.     for {set i 0} {$i < $argc} {incr i} {
  108. if {[string compare -address [lindex $argv $i]] == 0} {
  109.     if {$i < [expr $argc - 1]} {
  110. set serverAddress [lindex $argv [expr $i + 1]]
  111.     }
  112.     break
  113. }
  114.     }
  115. }
  116. if {![info exists serverAddress]} {
  117.     set serverAddress 0.0.0.0
  118. }
  119. if {$serverIsSilent == 0} {
  120.     set l "Remote server listening on port $serverPort, IP $serverAddress."
  121.     puts ""
  122.     puts $l
  123.     for {set c [string length $l]} {$c > 0} {incr c -1} {puts -nonewline "-"}
  124.     puts ""
  125.     puts ""
  126.     puts "You have set the Tcl variables serverAddress to $serverAddress and"
  127.     puts "serverPort to $serverPort. You can set these with the -address and"
  128.     puts "-port command line options, or as environment variables in your"
  129.     puts "shell."
  130.     puts ""
  131.     puts "NOTE: The tests will not work properly if serverAddress is set to"
  132.     puts ""localhost" or 127.0.0.1."
  133.     puts ""
  134.     puts "When you invoke tcltest to run the tests, set the variables"
  135.     puts "remoteServerPort to $serverPort and remoteServerIP to"
  136.     puts "[info hostname]. You can set these as environment variables"
  137.     puts "from the shell. The tests will not work properly if you set"
  138.     puts "remoteServerIP to "localhost" or 127.0.0.1."
  139.     puts ""
  140.     puts -nonewline "Type Ctrl-C to terminate--> "
  141.     flush stdout
  142. }
  143. if {[catch {set serverSocket 
  144. [socket -myaddr $serverAddress -server __accept__ $serverPort]} msg]} {
  145.     puts "Server on $serverAddress:$serverPort cannot start: $msg"
  146. } else {
  147.     vwait __server_wait_variable__
  148. }