2014-09-14 6 views
0

Я пытаюсь подключиться к нескольким серверам одновременно с помощью библиотеки ускорения cpp. Я написал класс Socket, но по какой-то причине, когда у меня есть несколько экземпляров одного класса и пытаюсь подключиться, другой экземпляр также будет подключаться.увеличить несколько клиентских подключений

socket.h

class Socket{ 
private: 
    boost::asio::io_service io_service_; 

#if USE_SSL 
    boost::asio::ssl::context context; 
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssocket; 
#else 
    tcp::socket ssocket; 
#endif 

    int headerLength; 
public: 
    Socket(int = HEADERLENGTH); 

    bool connect(std::string, std::string); 
}; 

socket.cpp

#if USE_SSL 
Socket::Socket(int h) : context(boost::asio::ssl::context::sslv23), ssocket(io_service_, context){ 
    headerLength = h; 
} 
#else 
Socket::Socket(int h) : ssocket(io_service_){ 
    headerLength = h; 
} 
#endif 

bool Socket::connect(std::string host, std::string port){ 
    tcp::resolver resolver(io_service_); 
    tcp::resolver::query query(tcp::v4(), host.c_str(), port.c_str()); 
    tcp::resolver::iterator iterator; 

    std::cout << "resolving " << host << "\n"; 
    try { 
     iterator = resolver.resolve(query); 
    } 
    catch (...){ 
     return false; 
    } 
    //ssocket.lowest_layer().set_option(tcp::no_delay(true)); 
    std::cout << "connecting to " << host << "\n"; 
    boost::system::error_code ec; 
#if USE_SSL 
    try { 
     boost::asio::connect(ssocket.lowest_layer(), iterator, ec); 
     if (ec){ // throw error 
      return false; 
     } 
    } 
    catch (...){ 
     return false; 
    } 
    //ssocket.set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_fail_if_no_peer_cert); 
    ssocket.set_verify_mode(boost::asio::ssl::context::verify_none); 

    ssocket.handshake(boost::asio::ssl::stream<tcp::socket>::client); 
    std::cout << "connected \n"; 
    return true; 
#else 
    boost::asio::connect(ssocket, iterator, ec); 
    return !ec; 
#endif 
} 

Я чувствую, как это приходится делать что-то с тем, как конструктор называется, но AFAIK не являются ни контекст, ни ssocket статические переменные, или я не прав? USE_SSL - 1. Буду признателен за вашу помощь.

ответ

0

Я думаю, проблема в том, как вы используете свой класс Socket. Вот упрощенная версия кода, показывая, что прекрасно работает на синхронном подходе:

#include <boost/asio.hpp> 
#include <boost/asio/ssl.hpp> 
#include <iostream> 

class SecureSocket{ 
private: 
    boost::asio::io_service io_service_; 
    boost::asio::ssl::context context; 
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssocket; 

public: 

    SecureSocket(): 
     context(boost::asio::ssl::context::sslv23), 
     ssocket(io_service_, context) 
    { 
     context.set_verify_mode(boost::asio::ssl::context::verify_none); 
    } 

    void connect(std::string host, std::string port){ 
     boost::asio::ip::tcp::resolver resolver(io_service_); 
     boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), host.c_str(), port.c_str()); 
     boost::asio::ip::tcp::resolver::iterator iterator; 

     std::cout << "resolving " << host << "\n"; 
     iterator = resolver.resolve(query); 

     std::cout << "connecting to " << host << "\n"; 
     boost::asio::connect(ssocket.lowest_layer(), iterator); 

     ssocket.handshake(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::client); 

     std::cout << "connected \n"; 
    } 
}; 

int main(int argc, char** argv) { 
    SecureSocket s, s2; 

    try{ 
     s.connect("echo.websocket.org","https"); 
     std::cout << "---------\n"; 
     s2.connect("stackoverflow.com","https"); 

    }catch(std::exception& e){ 
     std::cout << "Error: " << e.what(); 
     return 1; 
    } 

    return 0; 
} 

Может быть, вы вызываете каждый экземпляр на своем собственном потоке, и что Мессинг вещи. Покажите нам, что часть кода, пожалуйста.