X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=acceptor.cpp;h=29a7f8c1f675d356f2af42047b473a9b82f44169;hp=b5b4039899335714a5bdb47125be902aae95d706;hb=4935d50a97f7391795b7974b40c85003189f117a;hpb=f2530dbb8415f9e7cc0f2d4b45741120c95e8a05 diff --git a/acceptor.cpp b/acceptor.cpp index b5b4039..29a7f8c 100644 --- a/acceptor.cpp +++ b/acceptor.cpp @@ -67,7 +67,7 @@ int create_server_socket(const sockaddr_in6 &addr, SocketType socket_type) return server_sock; } -sockaddr_in6 CreateAnyAddress(int port) +sockaddr_in6 create_any_address(int port) { sockaddr_in6 sin6; memset(&sin6, 0, sizeof(sin6)); @@ -76,7 +76,7 @@ sockaddr_in6 CreateAnyAddress(int port) return sin6; } -sockaddr_in6 ExtractAddressFromAcceptorProto(const AcceptorProto &proto) +sockaddr_in6 extract_address_from_acceptor_proto(const AcceptorProto &proto) { sockaddr_in6 sin6; memset(&sin6, 0, sizeof(sin6)); @@ -91,15 +91,20 @@ sockaddr_in6 ExtractAddressFromAcceptorProto(const AcceptorProto &proto) return sin6; } -Acceptor::Acceptor(int server_sock, const sockaddr_in6 &addr) +Acceptor::Acceptor(int server_sock, const sockaddr_in6 &addr, + const string &certificate_chain, const string &private_key) : server_sock(server_sock), - addr(addr) + addr(addr), + certificate_chain(certificate_chain), + private_key(private_key) { } Acceptor::Acceptor(const AcceptorProto &serialized) : server_sock(serialized.server_sock()), - addr(ExtractAddressFromAcceptorProto(serialized)) + addr(extract_address_from_acceptor_proto(serialized)), + certificate_chain(serialized.certificate_chain()), + private_key(serialized.private_key()) { } @@ -112,6 +117,8 @@ AcceptorProto Acceptor::serialize() const serialized.set_server_sock(server_sock); serialized.set_addr(buf); serialized.set_port(ntohs(addr.sin6_port)); + serialized.set_certificate_chain(certificate_chain); + serialized.set_private_key(private_key); return serialized; } @@ -123,15 +130,15 @@ void Acceptor::close_socket() void Acceptor::do_work() { while (!should_stop()) { - if (!wait_for_activity(server_sock, POLLIN, NULL)) { + if (!wait_for_activity(server_sock, POLLIN, nullptr)) { continue; } sockaddr_in6 addr; socklen_t addrlen = sizeof(addr); - // Get a new socket. - int sock = accept(server_sock, reinterpret_cast(&addr), &addrlen); + // Get a new socket, and set it as nonblocking. + int sock = accept4(server_sock, reinterpret_cast(&addr), &addrlen, SOCK_NONBLOCK); if (sock == -1 && errno == EINTR) { continue; } @@ -141,22 +148,16 @@ void Acceptor::do_work() continue; } - // Set the socket as nonblocking. - int one = 1; - if (ioctl(sock, FIONBIO, &one) == -1) { - log_perror("ioctl(FIONBIO)"); - exit(1); - } - // Enable TCP_CORK for maximum throughput. In the rare case that the // stream stops entirely, this will cause a small delay (~200 ms) // before the last part is sent out, but that should be fine. + int one = 1; if (setsockopt(sock, SOL_TCP, TCP_CORK, &one, sizeof(one)) == -1) { log_perror("setsockopt(TCP_CORK)"); // Can still continue. } // Pick a server, round-robin, and hand over the socket to it. - servers->add_client(sock); + servers->add_client(sock, this); } }