0

Это мой класс:Как сделать SSL-сокет доступным между функциями?

class SSLIRC : public Bot 
      { 
       public: 
         SSLIRC(void); 
         void sockconnect(char*, int, bool); 
         void sockwrite(char*); 
         std::string sockread(void); 
         bool connected; 
         bool verbose; 
       private: 
         WSADATA wsaData; 
         SOCKET m_socket; 
         sockaddr_in clientService; 
         LPHOSTENT hostEntry; 

      }; 

и это мой SSLIRC :: sockconnect

void SSLIRC::sockconnect(char* hName, int portNum, bool debug) 
{ 
    verbose = debug; 
    SSL *sslSocket = 0; 
    SSL_CTX *sslContext = 0; 
    int error = WSAStartup(MAKEWORD(2,0),&wsaData); 

    if (error != NO_ERROR) 
     std::cout << "Client: Error at WSAStartup().\n"; 
    else 
     std::cout << "Client: WSAStartup() is OK.\n"; 

    fflush(stdout); 

    // socket 
    int socket = 0; 
    // struct for socket 
    struct sockaddr_in host_addr = {0}; 
    //information about host 
    struct hostent *host = {0}; 
    // name of host 

    host = gethostbyname(hName); 
    if (host == NULL) 
    { 
     printf("Unknown Host %s\n", hName); 
     exit (0); 
    } 
    // create socket 
    // for SSL need SOCK_STREAM socket 
    socket = ::socket(PF_INET, SOCK_STREAM, 0); 
    if (socket < 0) 
    { 
     printf("Socket Error\n"); 
     exit (0); 
    } 

    // create host struct 
    host_addr.sin_family = AF_INET; 
    // set IP addres 
    host_addr.sin_addr = *((struct in_addr *)host->h_addr); 
    // set HTTPS port 
    host_addr.sin_port = htons(portNum); 
    // connet 
    if (connect(socket, (struct sockaddr *)&host_addr, sizeof(host_addr)) == -1) 
    { 
     closesocket(socket); 
     printf("Connection Error\n"); 
     exit (0); 
    } 

    sslContext = SSL_CTX_new(SSLv23_client_method()); 
    sslSocket = SSL_new(sslContext); 

    if(!sslSocket) 
    { 
     closesocket(socket); 
     printf("SSL creation error\n"); 
     exit(0); 
    } 
    // join sslSocket and socket 
    SSL_set_fd(sslSocket, socket); 
    // conect sslSocket 
    error = SSL_connect(sslSocket); 
    if(!error) 
    { 
     closesocket(socket); 
     printf("SSL connect error = %d\n", error); 
     error = SSL_get_error(sslSocket, error); 
     printf("SSL error: %d\n", error); 
     exit (0); 
    } 

    printf("SSL handshake established.\n"); 

} 

Как объявить SSLSocket так это доступно в моем классе для других функций для использования?

ответ

0

Я бы поставил SSLSocket в заголовке следующим образом:

class SSLIRC : public Bot 
{ 
public: 
    SSLIRC(void); 
    void sockconnect(char*, int, bool); 
    void sockwrite(char*); 
    std::string sockread(void); 
    bool connected; 
    bool verbose; 
private: 
    WSADATA wsaData; 
    SOCKET m_socket; 
    sockaddr_in clientService; 
    LPHOSTENT hostEntry; 
    SSL *sslSocket; 
    int socket; 
}; 

Таким образом SSLSocket и гнездо доступны для всего экземпляра класса для использования, но не доступны за пределами класса. Затем, если вам нужен метод send_data, этот метод может использовать this->socket или this->sslSocket по мере необходимости.

Вы можете инициализировать эти гнезда в методе:

SSLIRC::SSLIRC() 
{ 
    this->socket = 0; 
    this->sslSocket = 0; 
} 

т.е. в конструктор. Это обычная практика.

+0

Я пробовал это уже, но он сказал синтаксическую ошибку: missing ';' перед '*' отсутствующий спецификатор типа - int. Примечание: C++ не поддерживает default-int – thorvald 2010-11-30 03:00:50