diff --git a/include/libtorrent/udp_socket.hpp b/include/libtorrent/udp_socket.hpp index 996cb7eb9..ca9fd9871 100644 --- a/include/libtorrent/udp_socket.hpp +++ b/include/libtorrent/udp_socket.hpp @@ -139,6 +139,11 @@ namespace libtorrent struct queued_packet { + queued_packet() + : hostname(NULL) + , flags(0) + {} + udp::endpoint ep; char* hostname; buffer buf; diff --git a/src/udp_socket.cpp b/src/udp_socket.cpp index a09957de1..c1accb56c 100644 --- a/src/udp_socket.cpp +++ b/src/udp_socket.cpp @@ -188,7 +188,7 @@ void udp_socket::send(udp::endpoint const& ep, char const* p, int len { // send udp packets through SOCKS5 server wrap(ep, p, len, ec); - return; + return; } if (m_queue_packets) @@ -556,13 +556,11 @@ void udp_socket::wrap(char const* hostname, int port, char const* p, int len, er iovec[1] = asio::const_buffer(p, len); #if TORRENT_USE_IPV6 - if (m_udp_proxy_addr.address().is_v4() && m_ipv4_sock.is_open()) + if (m_udp_proxy_addr.address().is_v6() && m_ipv6_sock.is_open()) + m_ipv6_sock.send_to(iovec, m_udp_proxy_addr, 0, ec); + else #endif m_ipv4_sock.send_to(iovec, m_udp_proxy_addr, 0, ec); -#if TORRENT_USE_IPV6 - else - m_ipv6_sock.send_to(iovec, m_udp_proxy_addr, 0, ec); -#endif } // unwrap the UDP packet from the SOCKS5 header @@ -767,7 +765,7 @@ void udp_socket::set_proxy_settings(proxy_settings const& ps) error_code ec; m_socks5_sock.close(ec); m_tunnel_packets = false; - + m_proxy_settings = ps; if (m_abort) return; @@ -1269,7 +1267,7 @@ void udp_socket::connect2(error_code const& e) drain_queue(); return; } - + m_tunnel_packets = true; drain_queue(); diff --git a/test/socks.py b/test/socks.py index 4f54a7e11..0dfd582d3 100644 --- a/test/socks.py +++ b/test/socks.py @@ -10,10 +10,10 @@ import threading import sys def debug(s): - print >>sys.stderr, 'socks.py: ', s + print >>sys.stderr, 'socks.py: ', s def error(s): - print >>sys.stderr, 'socks.py, ERROR: ', s + print >>sys.stderr, 'socks.py, ERROR: ', s class MyTCPServer(ThreadingTCPServer): allow_reuse_address = True @@ -27,6 +27,7 @@ VERSION = '\x05' NOAUTH = '\x00' USERPASS = '\x02' CONNECT = '\x01' +UDP_ASSOCIATE = '\x03' IPV4 = '\x01' IPV6 = '\x04' DOMAIN_NAME = '\x03' @@ -90,8 +91,8 @@ class SocksHandler(StreamRequestHandler): if allow_v4 and version == '\x04': cmd = self.read(1) - if cmd != CONNECT: - error('Only supports connect method not (%r) closing' % cmd) + if cmd != CONNECT and cmd != UDP_ASSOCIATE: + error('Only supports connect and udp-associate method not (%r) closing' % cmd) self.close_request() return @@ -160,8 +161,8 @@ class SocksHandler(StreamRequestHandler): if version != '\x05': error('Wrong version number (%r) closing...' % version) self.close_request() - elif cmd != CONNECT: - error('Only supports connect method not (%r) closing' % cmd) + elif cmd != CONNECT and cmd != UDP_ASSOCIATE: + error('Only supports connect and udp-associate method not (%r) closing' % cmd) self.close_request() elif zero != '\x00': error('Mangled request. Reserved field (%r) is not null' % zero) @@ -193,6 +194,11 @@ class SocksHandler(StreamRequestHandler): except Exception, e: print e return + + if cmd == UDP_ASSOCIATE: + debug("no UDP support yet, closing") + return; + debug("Creating forwarder connection to %s:%d" % (out_address[0], out_address[1])) try: diff --git a/test/test_transfer.cpp b/test/test_transfer.cpp index 0b88e42c3..474365596 100644 --- a/test/test_transfer.cpp +++ b/test/test_transfer.cpp @@ -142,7 +142,7 @@ void test_transfer(int proxy_type, settings_pack const& sett fprintf(stderr, "\n\n ==== TESTING %s proxy ==== disk-full: %s\n\n\n" , test_name[proxy_type], test_disk_full ? "true": "false"); - + // in case the previous run was terminated error_code ec; remove_all("tmp1_transfer", ec); @@ -381,7 +381,7 @@ TORRENT_TEST(transfer) fprintf(stderr, "compact mode\n"); test_transfer(0, p, false, storage_mode_compact); #endif - + error_code ec; remove_all("tmp1_transfer", ec); remove_all("tmp2_transfer", ec);