X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=acceptor.cpp;h=593e4d4eb9cc207fce83730aee1c29e7a35519f2;hp=32a89fa7670d7221b54e7c98ffa0f8ce7e255abd;hb=07569f8e011cd9b064c64bef1ce56f77bf7ddf53;hpb=981cdb79fdbf75ff755c80297d6d0e893d076555;ds=sidebyside diff --git a/acceptor.cpp b/acceptor.cpp index 32a89fa..593e4d4 100644 --- a/acceptor.cpp +++ b/acceptor.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include "acceptor.h" @@ -20,7 +19,7 @@ using namespace std; extern ServerPool *servers; -int create_server_socket(int port, SocketType socket_type) +int create_server_socket(const sockaddr_in6 &addr, SocketType socket_type) { int server_sock; if (socket_type == TCP_SOCKET) { @@ -53,12 +52,7 @@ int create_server_socket(int port, SocketType socket_type) exit(1); } - sockaddr_in6 addr; - memset(&addr, 0, sizeof(addr)); - addr.sin6_family = AF_INET6; - addr.sin6_port = htons(port); - - if (bind(server_sock, reinterpret_cast(&addr), sizeof(addr)) == -1) { + if (bind(server_sock, reinterpret_cast(&addr), sizeof(addr)) == -1) { log_perror("bind"); exit(1); } @@ -72,24 +66,52 @@ int create_server_socket(int port, SocketType socket_type) return server_sock; } + +sockaddr_in6 create_any_address(int port) +{ + sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(port); + return sin6; +} + +sockaddr_in6 extract_address_from_acceptor_proto(const AcceptorProto &proto) +{ + sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = AF_INET6; + + if (!proto.addr().empty()) { + int ret = inet_pton(AF_INET6, proto.addr().c_str(), &sin6.sin6_addr); + assert(ret == 1); + } + + sin6.sin6_port = htons(proto.port()); + return sin6; +} -Acceptor::Acceptor(int server_sock, int port) +Acceptor::Acceptor(int server_sock, const sockaddr_in6 &addr) : server_sock(server_sock), - port(port) + addr(addr) { } Acceptor::Acceptor(const AcceptorProto &serialized) : server_sock(serialized.server_sock()), - port(serialized.port()) + addr(extract_address_from_acceptor_proto(serialized)) { } AcceptorProto Acceptor::serialize() const { + char buf[INET6_ADDRSTRLEN]; + inet_ntop(addr.sin6_family, &addr.sin6_addr, buf, sizeof(buf)); + AcceptorProto serialized; serialized.set_server_sock(server_sock); - serialized.set_port(port); + serialized.set_addr(buf); + serialized.set_port(ntohs(addr.sin6_port)); return serialized; }