#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include "DieWithMessage.h" void PrintSocketAddress(const struct sockaddr *address, FILE *stream); int main(int argc, char *argv[]) { if(argc != 3) DieWithUserMessage("Parameter(s)", "<Address/Name> <Port/Server>"); char *addrString = argv[1]; char *portString = argv[2]; struct addrinfo addrCriteria; memset(&addrCriteria, 0, sizeof(addrCriteria)); addrCriteria.ai_family = AF_UNSPEC; addrCriteria.ai_socktype = SOCK_STREAM; addrCriteria.ai_protocol = IPPROTO_TCP; struct addrinfo *addrList; int rtnVal = getaddrinfo(addrString, portString, &addrCriteria, &addrList); if(rtnVal != 0) DieWithUserMessage("getaddrinfo() failed", gai_strerror(rtnVal)); struct addrinfo *addr; for(addr = addrList; addr != NULL; addr = addr->ai_next) { PrintSocketAddress(addr->ai_addr, stdout); fputc('\n', stdout); } freeaddrinfo(addrList); exit(0); } void PrintSocketAddress(const struct sockaddr *address, FILE *stream) { if(address == NULL || stream == NULL) return; void *numericAddress; char addrBuffer[INET6_ADDRSTRLEN]; in_port_t port; switch(address->sa_family) { case AF_INET: numericAddress = &((struct sockaddr_in* ) address)->sin_addr; port = ntohs(((struct sockaddr_in *)address)->sin_port); break; case AF_INET6: numericAddress = &((struct sockaddr_in6 *)address)->sin6_addr; port = ntohs(((struct sockaddr_in6 *)address)->sin6_port); break; default: fputs("[unknown type]", stream); return; } if(inet_ntop(address->sa_family, numericAddress, addrBuffer, sizeof(addrBuffer)) == NULL) fputs("[invalid address]", stream); else { fprintf(stream, "%s", addrBuffer); if(port != 0) fprintf(stream, "-%u", port); } }