code: func (udp *udpProxySocket) proxyClient(cliAddr net.Addr, svrConn net.Conn, activeClients *ClientCache, timeout time.Duration) {
  	defer svrConn.Close()
  	var buffer [4096]byte
  	for {
  		n, err := svrConn.Read(buffer[0:])
  		if err != nil {
  			if !logTimeout(err) {
  				klog.Errorf("Read failed: %v", err)
  			}
  			break
  		}
  		err = svrConn.SetDeadline(time.Now().Add(timeout))
  		if err != nil {
  			klog.Errorf("SetDeadline failed: %v", err)
  			break
  		}
  		n, err = udp.WriteTo(buffer[0:n], cliAddr)
  		if err != nil {
  			if !logTimeout(err) {
  				klog.Errorf("WriteTo failed: %v", err)
  			}
  			break
  		}
  	}
  	activeClients.Mu.Lock()
  	delete(activeClients.Clients, cliAddr.String())
  	activeClients.Mu.Unlock()
  }
docs: // This function is expected to be called as a goroutine.
  // TODO: Track and log bytes copied, like TCP