Added gracefully shutdown for clients
Added the gracefully shutdown for all client connections to release all these resources.
This commit is contained in:
		
							parent
							
								
									6ae3b46fc1
								
							
						
					
					
						commit
						316b4a6c54
					
				
							
								
								
									
										25
									
								
								Forward.go
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								Forward.go
									
									
									
									
									
								
							| @ -68,9 +68,30 @@ func forward(localConn net.Conn, config *ssh.ClientConfig) { | |||||||
| 			// Fine, the connections are up and ready :-)
 | 			// Fine, the connections are up and ready :-)
 | ||||||
| 			log.Printf("The remote end-point %s is connected.\n", remoteAddrString) | 			log.Printf("The remote end-point %s is connected.\n", remoteAddrString) | ||||||
| 
 | 
 | ||||||
|  | 			// To be able to close down both transfer threads, we create a channel:
 | ||||||
|  | 			quit := make(chan bool) | ||||||
|  | 
 | ||||||
| 			// Create the transfers to/from both sides (two new threads are created for this):
 | 			// Create the transfers to/from both sides (two new threads are created for this):
 | ||||||
| 			go transfer(localConn, sshConn, `Local => Remote`) | 			go transfer(localConn, sshConn, `Local => Remote`, quit) | ||||||
| 			go transfer(sshConn, localConn, `Remote => Local`) | 			go transfer(sshConn, localConn, `Remote => Local`, quit) | ||||||
|  | 
 | ||||||
|  | 			// Wait and look if any of the two transfer theads are down:
 | ||||||
|  | 			isRunning := true | ||||||
|  | 			for isRunning { | ||||||
|  | 				select { | ||||||
|  | 				case <-quit: | ||||||
|  | 					log.Println(`At least one transfer was stopped.`) | ||||||
|  | 					isRunning = false | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Now, close all the channels and therefore, force the other / second thread to go down:
 | ||||||
|  | 			log.Println(`Close now all connections.`) | ||||||
|  | 			sshConn.Close() | ||||||
|  | 			localConn.Close() | ||||||
|  | 			sshClientConnection.Close() | ||||||
|  | 
 | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // The transfer function.
 | // The transfer function.
 | ||||||
| func transfer(fromReader io.Reader, toWriter io.Writer, name string) { | func transfer(fromReader io.Reader, toWriter io.Writer, name string, quit chan bool) { | ||||||
| 
 | 
 | ||||||
| 	log.Printf("%s transfer started.", name) | 	log.Printf("%s transfer started.", name) | ||||||
| 
 | 
 | ||||||
| @ -22,4 +22,6 @@ func transfer(fromReader io.Reader, toWriter io.Writer, name string) { | |||||||
| 	} else { | 	} else { | ||||||
| 		log.Printf("%s transfer closed.\n", name) | 		log.Printf("%s transfer closed.\n", name) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	quit <- true | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user