From b6c9d9a880f6f1a6908a3c62dfccdce3e68dad80 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Wed, 10 Sep 2014 08:47:19 +0200 Subject: ICE-5582 (SOCKs test), ICE-5314 (HTTP proxies), major refactoring of networking code (addition of StreamSocket class abstraction) --- cpp/src/Ice/Network.cpp | 140 ++++-------------------------------------------- 1 file changed, 10 insertions(+), 130 deletions(-) (limited to 'cpp/src/Ice/Network.cpp') diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index 919826f6e2e..0ad8aa6cefa 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -201,7 +202,6 @@ SOCKET createSocketImpl(bool udp, int family) { SOCKET fd; - if(udp) { fd = socket(family, SOCK_DGRAM, IPPROTO_UDP); @@ -786,118 +786,6 @@ IceInternal::NativeInfo::completed(SocketOperation operation) #endif -IceUtil::Shared* IceInternal::upCast(NetworkProxy* p) { return p; } - -#ifndef ICE_OS_WINRT - -IceInternal::SOCKSNetworkProxy::SOCKSNetworkProxy(const string& host, int port) : - _host(host), _port(port) -{ - assert(!host.empty()); - memset(&_address, 0, sizeof(_address)); -} - -IceInternal::SOCKSNetworkProxy::SOCKSNetworkProxy(const Address& addr) : - _port(0), _address(addr) -{ -} - -void -IceInternal::SOCKSNetworkProxy::beginWriteConnectRequest(const Address& addr, Buffer& buf) -{ - if(addr.saStorage.ss_family != AF_INET) - { - throw FeatureNotSupportedException(__FILE__, __LINE__, "SOCKS4 only supports IPv4 addresses"); - } - - // - // SOCKS connect request - // - buf.b.resize(9); - buf.i = buf.b.begin(); - Byte* dest = &buf.b[0]; - *dest++ = 0x04; // SOCKS version 4. - *dest++ = 0x01; // Command, establish a TCP/IP stream connection - - const Byte* src; - - // - // Port (already in big-endian order) - // - src = reinterpret_cast(&addr.saIn.sin_port); - *dest++ = *src++; - *dest++ = *src; - - // - // IPv4 address (already in big-endian order) - // - src = reinterpret_cast(&addr.saIn.sin_addr.s_addr); - *dest++ = *src++; - *dest++ = *src++; - *dest++ = *src++; - *dest++ = *src; - - *dest = 0x00; // User ID. -} - -void -IceInternal::SOCKSNetworkProxy::endWriteConnectRequest(Buffer& buf) -{ - buf.b.reset(); -} - -void -IceInternal::SOCKSNetworkProxy::beginReadConnectRequestResponse(Buffer& buf) -{ - // - // Read the SOCKS4 response whose size is 8 bytes. - // - buf.b.resize(8); - buf.i = buf.b.begin(); -} - -void -IceInternal::SOCKSNetworkProxy::endReadConnectRequestResponse(Buffer& buf) -{ - buf.i = buf.b.begin(); - - if(buf.b.end() - buf.i < 2) - { - throw UnmarshalOutOfBoundsException(__FILE__, __LINE__); - } - - const Byte* src = &(*buf.i); - const Byte b1 = *src++; - const Byte b2 = *src++; - if(b1 != 0x00 || b2 != 0x5a) - { - throw ConnectFailedException(__FILE__, __LINE__); - } - buf.b.reset(); -} - -NetworkProxyPtr -IceInternal::SOCKSNetworkProxy::resolveHost() const -{ - assert(!_host.empty()); - return new SOCKSNetworkProxy(getAddresses(_host, _port, EnableIPv4, Random, false, true)[0]); -} - -Address -IceInternal::SOCKSNetworkProxy::getAddress() const -{ - assert(_host.empty()); // Host must be resolved. - return _address; -} - -string -IceInternal::SOCKSNetworkProxy::getName() const -{ - return "SOCKS"; -} - -#endif // ICE_OS_WINRT - bool IceInternal::noMoreFds(int error) { @@ -947,7 +835,8 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport, Ice::En // to Windows API. // addr.host = ref new HostName(ref new String( - IceUtil::stringToWstring(host, IceUtil::getProcessStringConverter()).c_str())); + IceUtil::stringToWstring(host, + IceUtil::getProcessStringConverter()).c_str())); } stringstream os; os << port; @@ -1400,12 +1289,7 @@ IceInternal::fdToRemoteAddress(SOCKET fd, Address& addr) } std::string -IceInternal::fdToString(SOCKET fd, const NetworkProxyPtr& proxy, const Address& target, -#if defined(_WIN32) - bool connected) -#else - bool /*connected*/) -#endif +IceInternal::fdToString(SOCKET fd, const NetworkProxyPtr& proxy, const Address& target) { if(fd == INVALID_SOCKET) { @@ -1414,8 +1298,11 @@ IceInternal::fdToString(SOCKET fd, const NetworkProxyPtr& proxy, const Address& ostringstream s; -#if defined(_WIN32) - if(!connected) + Address remoteAddr; + bool peerConnected = fdToRemoteAddress(fd, remoteAddr); + +#ifdef _WIN32 + if(!peerConnected) { // // The local address is only accessible with connected sockets on Windows. @@ -1423,19 +1310,12 @@ IceInternal::fdToString(SOCKET fd, const NetworkProxyPtr& proxy, const Address& s << "local address = "; } else +#endif { Address localAddr; fdToLocalAddress(fd, localAddr); s << "local address = " << addrToString(localAddr); } -#else - Address localAddr; - fdToLocalAddress(fd, localAddr); - s << "local address = " << addrToString(localAddr); -#endif - - Address remoteAddr; - bool peerConnected = fdToRemoteAddress(fd, remoteAddr); if(proxy) { -- cgit v1.2.3