mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
| #!/usr/bin/tclsh
 | |
| 
 | |
| set read_running 0
 | |
| set write_running 0
 | |
| set read_eof 0 
 | |
| set theend 0
 | |
| 
 | |
| set nread 0
 | |
| set nwritten 0
 | |
| 
 | |
| proc ReadBack {fd} {
 | |
| 
 | |
| 	if { !$::write_running } {
 | |
| 		puts stderr "ERROR: connection closed unexpectedly!"
 | |
| 		set ::theend 1
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	set r [read $fd 4096]
 | |
| 	if {$r == ""} {
 | |
| 
 | |
| 		if {[eof $fd]} {
 | |
| 			puts stderr "EOF on socket"
 | |
| 			set ::read_running 0
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		# --- puts stderr "SPURIOUS, not reading"
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	# --- puts stderr "REPRINTING [string bytelength $r] bytes"
 | |
| 	puts -nonewline stdout $r
 | |
| 	incr ::nwritten [string bytelength $r]
 | |
| 	# --- puts stderr "DONE"
 | |
| 
 | |
| 	set remain [expr {$::nread - $::nwritten}]
 | |
| 	if { $::read_eof } {
 | |
| 		puts stderr "Finishing... read=$::nread written=$::nwritten diff=[expr {$::nwritten - $::nread}] - [expr {100.0*$remain/$::nread}]%"
 | |
| 	}
 | |
| 
 | |
| 	# Nothing more to read
 | |
| 	if {$remain == 0} {
 | |
| 		puts stderr "NOTHING MORE TO BE WRITTEN - exiting"
 | |
| 		set ::theend 1
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	after idle "ReadBack $fd"
 | |
| }
 | |
| 
 | |
| proc SendToSocket {fd} {
 | |
| 	global theend
 | |
| 
 | |
| 	if { !$::write_running } {
 | |
| 		# --- puts stderr "SERVER DOWN, not reading"
 | |
| 		fileevent stdin readable {}
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	if { $::read_eof } {
 | |
| 		# Don't read, already EOF.
 | |
| 
 | |
| 	}
 | |
| 	# --- puts stderr "READING cin"
 | |
| 	set r [read stdin 4096]
 | |
| 	if {$r == ""} {
 | |
| 		if {[eof stdin]} {
 | |
| 			if {!$::read_eof} {
 | |
| 				puts stderr "EOF, setting server off"
 | |
| 				set ::read_eof 1
 | |
| 			}
 | |
| 			# Just enough when the next SendToSocket will
 | |
| 			# not be scheduled.
 | |
| 			return
 | |
| 		}
 | |
| 		# --- puts stderr "SPURIOUS, not reading"
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	# --- puts stderr "SENDING [string bytelength $r] bytes"
 | |
| 	# Set blocking for a short moment of sending
 | |
| 	# in order to prevent losing data that must wait
 | |
| 	fconfigure $fd -blocking yes
 | |
| 	puts -nonewline $fd $r
 | |
| 	incr ::nread [string bytelength $r]
 | |
| 	fconfigure $fd -blocking no
 | |
| 
 | |
|     # --- if {[fblocked stdin]} {
 | |
|     # --- 	# Nothing more to read
 | |
|     # --- 	return
 | |
|     # --- }
 | |
| 	after idle "SendToSocket $fd"
 | |
| }
 | |
| 
 | |
| set fd [socket {*}$argv]
 | |
| fconfigure $fd -encoding binary -translation binary -blocking no -buffering none
 | |
| fileevent $fd readable "ReadBack $fd"
 | |
| 
 | |
| fconfigure stdin -encoding binary -translation binary -blocking no
 | |
| fconfigure stdout -encoding binary -translation binary
 | |
| fileevent stdin readable "SendToSocket $fd"
 | |
| 
 | |
| # --- puts stderr "READY, sending"
 | |
| set read_running 1
 | |
| set write_running 1
 | |
| 
 | |
| vwait theend
 | |
| 
 | |
| close $fd
 |