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.

Reply via email to