Как сделать сокет SSL доступным между функциями? - PullRequest
0 голосов
/ 30 ноября 2010

Это мой класс:

  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, чтобы он был доступен в моем классе для других функцийиспользовать?

1 Ответ

0 голосов
/ 30 ноября 2010

Я бы поместил 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;
}

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

...