#include #include #include #include int main(int c, char **a) { const char *port = (c < 2 ? "4444" : a[1]); int family = (c < 3 ? AF_INET6 : AF_INET), status, one = 1, zero = 0; addrinfo *res, hints{.ai_flags = AI_PASSIVE, .ai_family = family, .ai_protocol = IPPROTO_TCP}; if ((status = getaddrinfo(nullptr, port, &hints, &res))) { std::cerr << "Getaddrinfo failed: " << gai_strerror(status) << std::endl; return 1; } int s = socket(res->ai_family, res->ai_socktype, 0); setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); // setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)); if (bind(s, res->ai_addr, res->ai_addrlen)) { perror("Bind failed"); return 1; } freeaddrinfo(res); listen(s, 1); std::cout << "Listening on port \e[1;33m" << port << "\e[0m" << std::endl; while (1) { sockaddr *cliAddr = (sockaddr *)new sockaddr_storage; socklen_t cliAddrLen = sizeof(sockaddr_storage); int c = accept(s, cliAddr, &cliAddrLen); if (c == -1) { perror("Bind failed"); return 1; } std::stringstream msg; msg << "Client connected from:" << std::endl; char host[NI_MAXHOST], port[NI_MAXSERV]; status = getnameinfo(cliAddr, cliAddrLen, host, NI_MAXHOST, port, NI_MAXSERV, 0); if (status) std::cerr << "Getnameinfo failed: " << gai_strerror(status) << std::endl; msg << " [resolved] address: " << host << " port: " << port << std::endl; status = getnameinfo(cliAddr, cliAddrLen, host, NI_MAXHOST, port, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV); if (status) std::cerr << "Getnameinfo failed: " << gai_strerror(status) << std::endl; msg << " [numeric ] address: " << host << " port: " << port << std::endl; delete cliAddr; std::cout << msg.str() << std::flush; write(c, msg.str().c_str(), msg.str().length()); shutdown(c, SHUT_RDWR); close(c); } }