diff --git a/client/client.go b/client/client.go
index 43c77a05beb78894923470cac76c4f65623c07ee..6eb01c87a70a5464f569dbe37acea9e6d94f5152 100644
--- a/client/client.go
+++ b/client/client.go
@@ -437,20 +437,38 @@ func (c *Client) readTCPWriteUDP() {
 
 		for {
 			tcpBytes := <-fromTCP
-
 			c.openvpnAddrLock.RLock()
 			_, err := c.openvpnConn.WriteToUDP(tcpBytes, c.openvpnAddr)
 			c.openvpnAddrLock.RUnlock()
 			if err != nil {
 				c.error("Write err from %v to %v: %v", c.openvpnConn.LocalAddr(), c.openvpnConn.RemoteAddr(), err)
-				time.Sleep(time.Duration(3) * time.Second)
-				c.reconnect(c.obfs4Endpoints[0], 20)
-				return
+				c.openvpnAddrLock.Lock()
+				c.openvpnConn.Close()
+				c.openvpnConn, err = c.createOpenvpnConnection()
+				c.openvpnAddrLock.Unlock()
+				if err != nil {
+					c.openvpnAddrLock.RLock()
+					_, err := c.openvpnConn.WriteToUDP(tcpBytes, c.openvpnAddr)
+					c.openvpnAddrLock.RUnlock()
+					if err != nil {
+						c.error("Failed to resend. %v", err)
+					}
+				}
 			}
 		}
 	}
 }
 
+func (c *Client) createOpenvpnConnection() (*net.UDPConn, error) {
+	proxyAddr, err := net.ResolveUDPAddr("udp", c.ProxyAddr)
+	if err != nil {
+		c.error("cannot resolve UDP addr: %v", err)
+		return nil, err
+	}
+
+	return net.ListenUDP("udp", proxyAddr)
+}
+
 func (c *Client) Stop() (bool, error) {
 	c.mux.Lock()
 	defer c.mux.Unlock()