我有点问题。我想为这个IRC客户端添加SSL支持,但我不知道如何开始。有人有建议吗?
#include <cstring>
#include <fcntl.h>
#include "IRCSocket.h"
#define MAXDATASIZE 4096
bool IRCSocket::Init()
{
#ifdef _WIN32
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData))
{
std::cout << "Unable to initialize Winsock." << std::endl;
return false;
}
#endif
if ((_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
std::cout << "Socket error." << std::endl;
#ifdef _WIN32
WSACleanup();
#endif
return false;
}
int on = 1;
if (setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, (char const*)&on, sizeof(on)) == -1)
{
std::cout << "Invalid socket." << std::endl;
#ifdef _WIN32
WSACleanup();
#endif
return false;
}
#ifdef _WIN32
u_long mode = 0;
ioctlsocket(_socket, FIONBIO, &mode);
#else
fcntl(_socket, F_SETFL, O_NONBLOCK);
fcntl(_socket, F_SETFL, O_ASYNC);
#endif
return true;
}
bool IRCSocket::Connect(char const* host, int port)
{
hostent* he;
if (!(he = gethostbyname(host)))
{
std::cout << "Could not resolve host: " << host << std::endl;
#ifdef _WIN32
WSACleanup();
#endif
return false;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr = *((const in_addr*)he->h_addr);
memset(&(addr.sin_zero), '\0', 8);
if (connect(_socket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
std::cout << "Could not connect to: " << host << std::endl;
closesocket(_socket);
return false;
}
_connected = true;
return true;
}
void IRCSocket::Disconnect()
{
if (_connected)
{
#ifdef _WIN32
shutdown(_socket, 2);
#endif
closesocket(_socket);
_connected = false;
}
}
bool IRCSocket::SendData(char const* data)
{
if (_connected)
if (send(_socket, data, strlen(data), 0) == -1)
return false;
return true;
}
std::string IRCSocket::ReceiveData()
{
char buffer[MAXDATASIZE];
memset(buffer, 0, MAXDATASIZE);
int bytes = recv(_socket, buffer, MAXDATASIZE - 1, 0);
if (bytes > 0)
return std::string(buffer);
else
Disconnect();
return "";
}
此代码是IRC类的一部分,效果很好。我已经添加了整个代码以更好的方式解释问题。