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 및 소켓을 사용하는 클래스의 전체 예를 들어 사용할 수 있지만, 클래스의 사용할 수없는 외부 :
나는 이미 시도했지만 구문 오류가 있다고 말했다 : ';'가 없습니다. before '*' 누락 유형 지정자 - int가 사용됩니다. 참고 : C++은 default-int – thorvald
을 지원하지 않습니다. 내 역할에 미안하지만 어리석은 실수입니다. 헤더 파일에도 ssl.h를 포함해야했습니다. 나는 미리 컴파일 된 헤더를 사용하고있는 것이 필요하다고 생각하지 않았습니다. 클래스에서 SSL을 선언하기 위해 "특별한"작업을해야한다고 생각했습니다. – thorvald
@thorvald :'SSL_CTX *'도 private 멤버이어야하고,'SSLIRC' 생성자에서 그것을 초기화해야합니다. 현재 연결될 때마다 SSL 컨텍스트가 누출됩니다. – caf