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; 

      }; 

이 그것을 사용하는 다른 함수 내 수업 시간에 사용할 수 있도록 내가의 SSLSocket를 선언하려면 어떻게 내 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"); 

} 

입니까?

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 및 소켓을 사용하는 클래스의 전체 예를 들어 사용할 수 있지만, 클래스의 사용할 수없는 외부 :

답변

0

나는과 같이 헤더에의 SSLSocket을 둘 것입니다. 그런 다음 send_data 메소드를 원할 경우이 메소드는 필요에 따라 this->socket 또는 this->sslSocket을 사용할 수 있습니다.

당신은 방법이 소켓을 초기화하기 수 :

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

, 즉 생성자에서. 이것은 일반적인 관행입니다.

+0

나는 이미 시도했지만 구문 오류가 있다고 말했다 : ';'가 없습니다. before '*' 누락 유형 지정자 - int가 사용됩니다. 참고 : C++은 default-int – thorvald

+0

을 지원하지 않습니다. 내 역할에 미안하지만 어리석은 실수입니다. 헤더 파일에도 ssl.h를 포함해야했습니다. 나는 미리 컴파일 된 헤더를 사용하고있는 것이 필요하다고 생각하지 않았습니다. 클래스에서 SSL을 선언하기 위해 "특별한"작업을해야한다고 생각했습니다. – thorvald

+0

@thorvald :'SSL_CTX *'도 private 멤버이어야하고,'SSLIRC' 생성자에서 그것을 초기화해야합니다. 현재 연결될 때마다 SSL 컨텍스트가 누출됩니다. – caf

관련 문제