#include "unp.h" int main(int argc, char **argv) { int sockfd, n; socklen_t len; char recvline[MAXLINE + 1]; struct sockaddr_storage servaddr; struct addrinfo hints, *res; char rhost[NI_MAXHOST]; int rc; bzero(&hints, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags |= AI_CANONNAME; if ( (n = getaddrinfo(argv[1], "1313", &hints, &res)) != 0) err_quit("udp_server error for %s: %s", argv[1], gai_strerror(n)); if (res->ai_canonname) printf("ai_canonname = %s\n", res->ai_canonname); printf("\taddress:%s\n", Sock_ntop(res->ai_addr, res->ai_addrlen )); rc = getnameinfo(res->ai_addr, res->ai_addrlen, rhost, NI_MAXHOST, NULL, NULL, NI_NAMEREQD); if (rc == 0) { printf("\tgetnameinfo: host = %s\n", rhost ); } else printf("getnameinfo returned %d (%s)\n", rc, gai_strerror(rc)); if ( (sockfd = socket(res->ai_family, SOCK_DGRAM, 0)) < 0) err_sys("socket error"); if (connect(sockfd, (SA *)res->ai_addr, res->ai_addrlen) < 0) err_sys("connect error"); len = sizeof(servaddr); Getsockname(sockfd, (SA *) &servaddr, &len); printf("local address %s\n", Sock_ntop((SA *) &servaddr, len)); len = sizeof(servaddr); Getpeername(sockfd, (SA *) &servaddr, &len); printf("remote address %s\n", Sock_ntop( (SA *) &servaddr, len)); write(sockfd,"HI",3); n = read(sockfd, recvline, MAXLINE) ; recvline[n] = 0; /* null terminate */ fputs(recvline, stdout); exit(0); }