Question

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?

Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top