// XXXXXXXXXXXXXXXXX YOUR NAME + INFO // XXXXXXXXXXXXXXXXX PARTNER'S NAME + INFO #include #include #include #include #include #include #include #include #include #include #include using namespace std; void Usage(char *progname); bool LookupName(char *name, unsigned short port, struct sockaddr_storage *ret_addr, size_t *ret_addrlen); bool Connect(const struct sockaddr_storage &addr, const size_t &addrlen, int *ret_fd); // XXXXXXXXXXXXXXXXX YOUR NEW FUNCTION DECLARATIONS HERE int main(int argc, char *argv[]) { if (argc != 3) { Usage(argv[0]); } unsigned short port = 0; if (sscanf(argv[2], "%hu", &port) != 1) { Usage(argv[0]); } // XXXXXXXXXXXXXXX YOUR IMPLEMENTATION GOES HERE return EXIT_SUCCESS; // Optimism :-) } // XXXXXXXXXXXXXXXXX YOUR NEW FUNCTION DEFINITIONS HERE void Usage(char *progname) { cerr << "usage: " << progname << " hostname port" << endl; exit(EXIT_FAILURE); } bool LookupName(char *name, unsigned short port, struct sockaddr_storage *ret_addr, size_t *ret_addrlen) { struct addrinfo hints, *results; int retval; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; // Do the lookup by invoking getaddrinfo(). if ((retval = getaddrinfo(name, NULL, &hints, &results)) != 0) { cerr << "getaddrinfo failed: "; cerr << gai_strerror(retval) << endl; return false; } assert(results != NULL); // Set the port in the first result. if (results->ai_family == AF_INET) { struct sockaddr_in *v4addr = (struct sockaddr_in *) results->ai_addr; v4addr->sin_port = htons(port); } else if (results->ai_family == AF_INET6) { struct sockaddr_in6 *v6addr = (struct sockaddr_in6 *) results->ai_addr; v6addr->sin6_port = htons(port); } else { cerr << "getaddrinfo failed to provide an IPv4 or IPv6 address"; cerr << endl; return false; } // Return the first result. memcpy(ret_addr, results->ai_addr, results->ai_addrlen); *ret_addrlen = results->ai_addrlen; // Clean up. freeaddrinfo(results); return true; } bool Connect(const struct sockaddr_storage &addr, const size_t &addrlen, int *ret_fd) { // Create the socket. int socket_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (socket_fd == -1) { cerr << "socket() failed: " << strerror(errno) << endl; return false; } // Connect the socket to the remote host. int res = connect(socket_fd, reinterpret_cast(&addr), addrlen); if (res == -1) { cerr << "connect() failed: " << strerror(errno) << endl; return false; } *ret_fd = socket_fd; return true; }