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()