3 #include <openssl/ssl.h>
11 if (state_ == SocketState::CONNECTED) {
18 struct addrinfo hints;
19 struct addrinfo *result, *rp;
22 if ( socket() == -1) {
26 memset(&result,0,
sizeof(
struct addrinfo));
27 memset(&hints,0,
sizeof(
struct addrinfo));
28 hints.ai_family = domain();
29 hints.ai_socktype = SOCK_STREAM;
30 hints.ai_flags |= AI_CANONNAME;
31 errorcode = getaddrinfo(host,service,&hints,&result);
33 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(errorcode));
43 if (!certfile.empty() && !keyfile.empty()) {
44 ssl_ = createSSL(ctx_);
45 ssl_->setOptions(verifyPeer);
46 if (verifyPeer && checkPeerSubjectName) {
47 ssl_->requiresCertPostValidation =
true;
48 ssl_->setHostname(host);
50 if (!ssl_->setCertificateAndKey(certfile.c_str(),keyfile.c_str())) {
54 if (!ssl_->setfd(socket())) {
60 log(
"Connecting to " +
string(result->ai_canonname) +
" on port " +
string(service));
62 for (rp = result; rp !=
nullptr; rp = rp->ai_next) {
63 if (::connect(socket(),rp->ai_addr,rp->ai_addrlen) == -1) {
64 if (errno == EINPROGRESS) {
65 state_ = SocketState::CONNECTING;
66 setEvents(EPOLLIN | EPOLLOUT | EPOLLRDHUP);
71 error(
"connect",strerror(errno));
81 error(
"Could not find host " +
string(host));
96 state_ = SocketState::CONNECTED;
102 if (state_ == SocketState::CONNECTING) {
103 if (events & EPOLLERR) {
104 error(
"handleEvents",strerror(errno));
106 if (events & EPOLLRDHUP) {
107 state_ = SocketState::UNCONNECTED;
110 if (events & EPOLLOUT) {