Thank you for your reply. But that works well in my test program.In that program I wrote a TCP/IP client which connects remote TCP/IP server via HTTP proxy,and it can send/receive message with remote server successfully.The method I used is exactly the same used in ActiveMQ-CPP.
Timothy Bish wrote: > > On Wed, 2010-06-23 at 20:07 -0700, alanchb wrote: >> I download the CMS source code,and modified the TcpSocket::connect >> function >> in TcpSocket.cpp in order to tunnel http proxy.Below is the code I >> modified >> or added: >> >> void TcpSocket::connect(const char* host, int port, int timeout) throw ( >> SocketException ) { >> >> try{ >> >> if( isConnected() ) { >> throw SocketException( __FILE__, __LINE__, >> "Socket::connect - Socket already connected. host: %s, >> port: %d", host, port ); >> } >> >> // Create the Address data >> checkResult( apr_sockaddr_info_get( >> &socketAddress, HTTP_PROXY_IP, APR_INET, HTTP_PROXY_PORT, 0, >> apr_pool.getAprPool() ) ); >> >> >> // Create the actual socket. >> checkResult( apr_socket_create( >> &socketHandle, socketAddress->family, SOCK_STREAM, >> APR_PROTO_TCP, apr_pool.getAprPool() ) ); >> >> // To make blocking-with-timeout sockets, we have to set it to >> // 'APR_SO_NONBLOCK==1(on) and timeout>0'. On Unix, we have no >> // problem to specify 'APR_SO_NONBLOCK==0(off) and timeout>0'. >> // Unfortunately, we have a problem on Windows. Setting the >> // mode to 'APR_SO_NONBLOCK==0(off) and timeout>0' causes >> // blocking-with-system-timeout sockets on Windows. >> // >> // >> http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html >> >> // If we have a connection timeout specified, temporarily set the >> socket to >> // non-blocking so that we can timeout the connect operation. >> We'll >> restore >> // to blocking mode right after we connect. >> apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, >> (timeout>0)?1:0 >> ); >> apr_socket_timeout_set( socketHandle, timeout ); >> >> // try to Connect to the provided address. >> checkResult(apr_socket_connect( socketHandle, socketAddress )); >> >> // Now that we are connected, we want to go back to blocking. >> apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 ); >> apr_socket_timeout_set( socketHandle, -1 ); >> >> char sHeader[256]; >> sprintf(sHeader,"CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n", >> host,port,host,port); >> apr_size_t size = strlen(sHeader)+1; >> apr_socket_send(socketHandle, sHeader, &size); >> >> char buf[256]; >> size = 256; >> apr_socket_recv(socketHandle, buf, &size); >> >> printf("Connect result:%s",buf); >> //the data received:HTTP/1.0 200 Connection >> established >> >> std::string strBuf = strupr(buf); >> if (!strBuf.substr(0, 4).compare("http") && strBuf.find("200") >> > 0 ) >> { >> //connect remote server via http proxy >> successfully! >> } >> >> // Create an input/output stream for this socket. >> inputStream = new SocketInputStream( socketHandle ); >> outputStream = new SocketOutputStream( socketHandle ); >> >> } catch( SocketException& ex ) { >> ex.setMark( __FILE__, __LINE__); >> try{ close(); } catch( lang::Exception& cx){ /* Absorb */ } >> throw ex; >> } catch( ... ) { >> try{ close(); } catch( lang::Exception& cx){ /* Absorb */ } >> throw SocketException( >> __FILE__, __LINE__, >> "TcpSocket::connect() - caught unknown exception" ); >> } >> } >> >> printf("Connect result:%s",buf); shows this: >> Connect result:HTTP/1.0 200 Connection established which means TCP socket >> connect remote server via http proxy successfully. >> >> Unfortunately some exception was throwed: >> CMSException:OpenWireFormatNegotiator::oneway Wire format negotiation >> timeout: peer did not send his wire format. >> FILE: >> ..\src\main\activemq\wireformat\openwire\OpenWireFormatNegotiator.cpp, >> LINE: >> 71 >> FILE: >> ..\src\main\activemq\wireformat\openwire\OpenWireFormatNegotiator.cpp, >> LINE: >> 80 >> FILE: >> ..\src\main\activemq\transport\correlator\ResponseCorrelator.cpp, >> LINE: 131 >> FILE: ..\src\main\activemq\core\ActiveMQConnection.cpp, LINE: 629 >> FILE: ..\src\main\activemq\core\ActiveMQConnection.cpp, LINE: 326 >> FILE: ..\src\main\activemq\core\ActiveMQConnectionFactory.cpp, LINE: >> 151 >> >> It seems like that the data sent via http proxy is not the right >> format(open >> wire format). >> >> My questions are: >> 1. Is it the right way(the code I modified) to link remote MQ server via >> HTTP proxy? >> 2. If the way is right,how to resolve the data format problem? >> >> Any help will be appreciated! > > > Um, no, that won't work. You should take some time to understand the > difference between a straight TCP/IP connected client and a request / > response based HTTP client. You can see how the AMQ HTTP transport > works by downloading the source from SVN. > > Regards > > > -- > Tim Bish > > Open Source Integration: http://fusesource.com > ActiveMQ in Action: http://www.manning.com/snyder/ > > Follow me on Twitter: http://twitter.com/tabish121 > My Blog: http://timbish.blogspot.com/ > > > -- View this message in context: http://old.nabble.com/Try-to-link-MQ-server-via-http-proxy%2Cbut-data-format-seems-is-wrong...-tp28978532p28982576.html Sent from the ActiveMQ - User mailing list archive at Nabble.com.