void CECTag::InitInt(uint64 data) { if (data <= 0xFF) { m_dataType = EC_TAGTYPE_UINT8; m_dataLen = 1; } else if (data <= 0xFFFF) { m_dataType = EC_TAGTYPE_UINT16; m_dataLen = 2; } else if (data <= 0xFFFFFFFF) { m_dataType = EC_TAGTYPE_UINT32; m_dataLen = 4; } else { m_dataType = EC_TAGTYPE_UINT64; m_dataLen = 8; } NewData(); switch (m_dataType) { case EC_TAGTYPE_UINT8: PokeUInt8( m_tagData, (uint8) data ); break; case EC_TAGTYPE_UINT16: RawPokeUInt16( m_tagData, ENDIAN_HTONS((uint16) data )); break; case EC_TAGTYPE_UINT32: RawPokeUInt32( m_tagData, ENDIAN_HTONL((uint32) data )); break; case EC_TAGTYPE_UINT64: RawPokeUInt64( m_tagData, ENDIAN_HTONLL(data) ); break; } }
void CSocks5StateMachine::process_send_command_request(bool entry) { if (entry) { // Prepare the request command buffer m_buffer[0] = SOCKS5_VERSION; switch (m_proxyCommand) { case PROXY_CMD_CONNECT: m_buffer[1] = SOCKS5_CMD_CONNECT; break; case PROXY_CMD_BIND: m_buffer[1] = SOCKS5_CMD_BIND; break; case PROXY_CMD_UDP_ASSOCIATE: m_buffer[1] = SOCKS5_CMD_UDP_ASSOCIATE; break; } m_buffer[2] = SOCKS5_RSV; m_buffer[3] = SOCKS5_ATYP_IPV4_ADDRESS; PokeUInt32( m_buffer+4, StringIPtoUint32(m_peerAddress->IPAddress()) ); RawPokeUInt16( m_buffer+8, ENDIAN_HTONS( m_peerAddress->Service() ) ); // Send the command packet m_packetLenght = 10; ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } }
wxDatagramSocket &CDatagramSocketProxy::SendTo( wxIPaddress &addr, const void* buf, wxUint32 nBytes ) { wxMutexLocker lock(m_socketLocker); m_lastUDPOperation = UDP_OPERATION_SEND_TO; m_lastUDPOverhead = PROXY_UDP_OVERHEAD_IPV4; if (m_proxyTCPSocket.GetUseProxy()) { if (m_udpSocketOk) { m_proxyTCPSocket.GetBuffer()[0] = SOCKS5_RSV; // Reserved m_proxyTCPSocket.GetBuffer()[1] = SOCKS5_RSV; // Reserved m_proxyTCPSocket.GetBuffer()[2] = 0; // FRAG m_proxyTCPSocket.GetBuffer()[3] = SOCKS5_ATYP_IPV4_ADDRESS; PokeUInt32( m_proxyTCPSocket.GetBuffer()+4, StringIPtoUint32(addr.IPAddress())); RawPokeUInt16( m_proxyTCPSocket.GetBuffer()+8, ENDIAN_HTONS( addr.Service() ) ); memcpy(m_proxyTCPSocket.GetBuffer() + PROXY_UDP_OVERHEAD_IPV4, buf, nBytes); nBytes += PROXY_UDP_OVERHEAD_IPV4; wxDatagramSocket::SendTo( m_proxyTCPSocket.GetProxyBoundAddress(), m_proxyTCPSocket.GetBuffer(), nBytes); // Uncomment here to see the buffer contents on console // DumpMem(m_proxyTCPSocket.GetBuffer(), nBytes, wxT("SendTo"), 3); } } else { wxDatagramSocket::SendTo(addr, buf, nBytes); } return *this; }
void CSocks4StateMachine::process_send_command_request(bool entry) { if (entry) { // Prepare the request command buffer m_buffer[0] = SOCKS4_VERSION; switch (m_proxyCommand) { case PROXY_CMD_CONNECT: m_buffer[1] = SOCKS4_CMD_CONNECT; break; case PROXY_CMD_BIND: m_buffer[1] = SOCKS4_CMD_BIND; break; case PROXY_CMD_UDP_ASSOCIATE: m_ok = false; return; break; } RawPokeUInt16(m_buffer+2, ENDIAN_HTONS(m_peerAddress->Service())); // Special processing for SOCKS4a switch (m_proxyData.m_proxyType) { case PROXY_SOCKS4a: PokeUInt32(m_buffer+4, StringIPtoUint32(wxT("0.0.0.1"))); break; case PROXY_SOCKS4: default: PokeUInt32(m_buffer+4, StringIPtoUint32(m_peerAddress->IPAddress())); break; } // Common processing for SOCKS4/SOCKS4a unsigned int offsetUser = 8; unsigned char lenUser = m_proxyData.m_userName.Len(); memcpy(m_buffer + offsetUser, unicode2char(m_proxyData.m_userName), lenUser); m_buffer[offsetUser + lenUser] = 0; // Special processing for SOCKS4a switch (m_proxyData.m_proxyType) { case PROXY_SOCKS4a: { unsigned int offsetDomain = offsetUser + lenUser + 1; unsigned char lenDomain = m_peerAddress->Hostname().Len(); memcpy(m_buffer + offsetDomain, unicode2char(m_peerAddress->Hostname()), lenDomain); m_buffer[offsetDomain + lenDomain] = 0; m_packetLenght = 1 + 1 + 2 + 4 + lenUser + 1 + lenDomain + 1; break; } case PROXY_SOCKS4: default: m_packetLenght = 1 + 1 + 2 + 4 + lenUser + 1; break; } // Send the command packet ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } }