|  | @@ -277,18 +277,6 @@ func (c *Connection) ReadMultiBuffer() (buf.MultiBuffer, error) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (c *Connection) waitForDataInput() error {
 | 
	
		
			
				|  |  | -	if c.State() == StatePeerTerminating {
 | 
	
		
			
				|  |  | -		return io.EOF
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	duration := time.Second * 8
 | 
	
		
			
				|  |  | -	if !c.rd.IsZero() {
 | 
	
		
			
				|  |  | -		duration = time.Until(c.rd)
 | 
	
		
			
				|  |  | -		if duration < 0 {
 | 
	
		
			
				|  |  | -			return ErrIOTimeout
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	for i := 0; i < 16; i++ {
 | 
	
		
			
				|  |  |  		select {
 | 
	
		
			
				|  |  |  		case <-c.dataInput.Wait():
 | 
	
	
		
			
				|  | @@ -298,6 +286,14 @@ func (c *Connection) waitForDataInput() error {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	duration := time.Second * 16
 | 
	
		
			
				|  |  | +	if !c.rd.IsZero() {
 | 
	
		
			
				|  |  | +		duration = time.Until(c.rd)
 | 
	
		
			
				|  |  | +		if duration < 0 {
 | 
	
		
			
				|  |  | +			return ErrIOTimeout
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	timeout := time.NewTimer(duration)
 | 
	
		
			
				|  |  |  	defer timeout.Stop()
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -335,23 +331,23 @@ func (c *Connection) Read(b []byte) (int, error) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (c *Connection) waitForDataOutput() error {
 | 
	
		
			
				|  |  | -	duration := time.Minute
 | 
	
		
			
				|  |  | -	if !c.wd.IsZero() {
 | 
	
		
			
				|  |  | -		duration = time.Until(c.wd)
 | 
	
		
			
				|  |  | -		if duration < 0 {
 | 
	
		
			
				|  |  | -			return ErrIOTimeout
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	for i := 0; i < 16; i++ {
 | 
	
		
			
				|  |  |  		select {
 | 
	
		
			
				|  |  | -		case <-c.dataInput.Wait():
 | 
	
		
			
				|  |  | +		case <-c.dataOutput.Wait():
 | 
	
		
			
				|  |  |  			return nil
 | 
	
		
			
				|  |  |  		default:
 | 
	
		
			
				|  |  |  			runtime.Gosched()
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	duration := time.Second * 16
 | 
	
		
			
				|  |  | +	if !c.wd.IsZero() {
 | 
	
		
			
				|  |  | +		duration = time.Until(c.wd)
 | 
	
		
			
				|  |  | +		if duration < 0 {
 | 
	
		
			
				|  |  | +			return ErrIOTimeout
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	timeout := time.NewTimer(duration)
 | 
	
		
			
				|  |  |  	defer timeout.Stop()
 | 
	
		
			
				|  |  |  
 |