Search code examples
visual-studio-2010visual-c++opensslvisual-c++-2010winsock2

How do I make an SSL socket available between functions?


This is my class:

  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;

             };

and this is my 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");

}

How do I declare sslSocket so it's available in my class for the other functions to use?


Solution

  • I would put sslSocket in the header like so:

    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;
    };
    

    This way sslSocket and socket are available for the entire instance of the class to use, but not available outside of the class. Then, if you wanted a send_data method this method could use this->socket or this->sslSocket as required.

    You could init these sockets in the method:

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

    i.e. in the constructor. This is the usual practise.