Comment puis-je faire une prise SSL disponible entre les fonctions?
-
29-09-2019 - |
Question
Ceci est ma classe:
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;
};
et voici mon 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");
}
Comment puis-je déclarer SSLSocket il est disponible dans ma classe pour les autres fonctions à utiliser?
La solution
je mettrais SSLSocket dans l'en-tête comme ceci:
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;
};
Cette SSLSocket manière et la prise sont disponibles pour toute l'instance de la classe à utiliser, mais non disponible en dehors de la classe. Ensuite, si vous voulez une méthode send_data cette méthode pourrait utiliser this->socket
ou this->sslSocket
au besoin.
Vous pourriez initialiser ces prises dans la méthode:
SSLIRC::SSLIRC()
{
this->socket = 0;
this->sslSocket = 0;
}
i.e.. dans le constructeur. Telle est la pratique habituelle.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow