diff --git a/server.cc b/server.cc index f5e5b8a..1579e68 100644 --- a/server.cc +++ b/server.cc @@ -1,12 +1,27 @@ -#include +// #include +// #include +// #include +// #include +// #include +// #include +// #include + +#include +#include +#include +#include +#include #include #include +#include #include - +#include +#include +#include namespace net { -class TCPServer +class Server { private: int status; @@ -14,30 +29,38 @@ private: struct addrinfo *servinfo; // Points to results public: - TCPServer(TCPServer&) = delete; - ~TCPServer() + Server(Server&) = delete; + Server() { this->stop(); } void init() { - memset(&hints, 0, sizeof hints); + memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; - if(!is_valid_struct(&hints, &servinfo)) - { - } + // if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) + // { + // fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); + // } + + + + // if(!is_valid_struct(&hints, &servinfo)) + // { + + // } } - bool is_valid_struct(addrinfo hints, addrinfo servinfo) - { - uint8_t result = getaddrinfo(NULL, "1337", &hints, &servinfo); - return + // bool is_valid_struct(addrinfo hints, addrinfo servinfo) + // { + // uint8_t result = getaddrinfo(NULL, "1337", &hints, &servinfo); + // return - } + // } void stop() @@ -46,4 +69,4 @@ public: freeaddrinfo(servinfo); } }; -} // End net namespace \ No newline at end of file +} // End net namespace diff --git a/showip.cc b/showip.cc new file mode 100644 index 0000000..a977320 --- /dev/null +++ b/showip.cc @@ -0,0 +1,69 @@ +// #include +// #include +// #include +// #include +// #include +// #include +// #include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + struct addrinfo hints, *res, *p; + int status; + char ipstr[INET6_ADDRSTRLEN]; + + if (argc != 2) + { + fprintf(stderr, "usage: showip hostname\n"); + return 1; + } + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) + { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); + return 2; + } + + printf("IP addresses for %s: \n\n", argv[1]); + + for (p = res; p != nullptr; p = p->ai_next) + { + void *addr; + char *ipver; + + // get the pointer to the address + if (p->ai_family == AF_INET) + { + struct sockaddr_in *ipv4 = (struct sockaddr_in*)p->ai_addr; + addr = &(ipv4->sin_addr); + ipver = "IPv4"; + } else + { + struct sockaddr_in6 *ipv6 = (struct sockaddr_in6*)p->ai_addr; + addr = &(ipv6->sin6_addr); + ipver = "IPv6"; + } + inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr)); + printf(" %s: %s\n", ipver, ipstr); + } + freeaddrinfo(res); + + return 0; +} \ No newline at end of file diff --git a/stream_server.cc b/stream_server.cc new file mode 100644 index 0000000..5a1feda --- /dev/null +++ b/stream_server.cc @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT "1337" + +#define BACKLOG 10 // pending connection queue + +void sigchld_handler(int s) +{ + int saved_errno = errno; + + while (waitpid(-1, NULL, WNOHANG) > 0); + + errno = saved_errno; +} + +void *get_in_addr(struct sockaddr *sa) +{ + if (sa->sa_family == AF_INET) + { + return &(((struct sockaddr_in*)sa)->sin_addr); + } +} + +int main(void) +{ + int sockfd, new_fd; + struct addrinfo hints, *servinfo, *p; + struct sockaddr_storage their_addr; + socklen_t sin_size; + struct sigaction sa; + int yes = 1; + char s[INET6_ADDRSTRLEN]; + int rv; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + + if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) + { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); + return 1; + } + + // Loop through all results until we bind + for (p = servinfo; p != NULL; p = p->ai_next) + { + if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) + { + perror("server: socket"); + continue; + } + + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) + { + perror("setsockopt"); + exit(1); + } + + if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) + { + close(sockfd); + perror("server: bind"); + continue; + } + + break; + } + + freeaddrinfo(servinfo); +}