char * ret;
struct sockaddr_in *ip4;
struct sockaddr_in6 *ip6;
- if (addr->ai_family == PF_INET) {
+ switch (addr->ai_family) {
+ case PF_INET:
ip4 = (struct sockaddr_in *) addr->ai_addr;
ret = inet_ntop(ip4->sin_family, &ip4->sin_addr, dst, cnt);
- } else {
+ break;
+ case PF_INET6:
ip6 = (struct sockaddr_in6 *) addr->ai_addr;
ret = inet_ntop(ip6->sin6_family, &ip6->sin6_addr, dst, cnt);
+ break;
+ default:
+ ret = NULL;
+ errno = EAFNOSUPPORT;
}
return ret;
}
int sock;
/* initialize hint structure */
memset(&hint, 0, sizeof(struct addrinfo));
- hint.ai_family = PF_UNSPEC; /* generic address (IPv4 or IPv6) */
- hint.ai_protocol = prot; /* protocol */
- hint.ai_socktype = type; /* socket type */
+ hint.ai_family = PF_UNSPEC; /* generic address (IPv4 or IPv6) */
+ hint.ai_protocol = prot; /* protocol */
+ hint.ai_socktype = type; /* socket type */
res = getaddrinfo(host, serv, &hint, &addr); /* calling getaddrinfo */
if (res != 0) { /* on error exit */
fprintf(stderr, "sockconn: resolution failed:");
// fprintf(stderr, "host %s, service %s, protocol %d", host, serv, prot);
fprintf(stderr, " %s\n", gai_strerror(res));
- errno = 0; /* clear errno */
+ errno = 0; /* clear errno */
return -1;
}
- /* loop on possible addresses */
save = addr;
- while (addr != NULL) {
+ while (addr != NULL) { /* loop on possible addresses */
/* get a socket */
sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
- if (sock < 0) {
- if (addr->ai_next != NULL) {
- addr=addr->ai_next;
- continue;
- } else {
+ if (sock < 0) { /* on error */
+ if (addr->ai_next != NULL) { /* if other addresses */
+ addr=addr->ai_next; /* take next */
+ continue; /* restart cycle */
+ } else { /* else stop */
perror("sockconn: cannot create socket");
return sock;
}
}
/* connect the socket */
if ( (res = connect(sock, addr->ai_addr, addr->ai_addrlen) < 0)) {
- if (addr->ai_next != NULL) {
- addr=addr->ai_next;
- close(sock);
- continue;
- } else {
+ if (addr->ai_next != NULL) { /* if other addresses */
+ addr=addr->ai_next; /* take next */
+ close(sock); /* close socket */
+ continue; /* restart cycle */
+ } else { /* else stop */
perror("sockconn: cannot connect");
close(sock);
return res;
}
- } else break;
+ } else break; /* ok, we are connected! */
}
- freeaddrinfo(save); /* done, release memory */
+ freeaddrinfo(save); /* done, release memory */
return sock;
}
/****************************************************************
char buf[INET6_ADDRSTRLEN];
/* initialize hint structure */
memset(&hint, 0, sizeof(struct addrinfo));
- hint.ai_flags = AI_PASSIVE; /* address for binding */
- hint.ai_family = PF_UNSPEC; /* generic address (IPv4 or IPv6) */
- hint.ai_protocol = prot; /* protocol */
- hint.ai_socktype = type; /* socket type */
+ hint.ai_flags = AI_PASSIVE; /* address for binding */
+ hint.ai_family = PF_UNSPEC; /* generic address (IPv4 or IPv6) */
+ hint.ai_protocol = prot; /* protocol */
+ hint.ai_socktype = type; /* socket type */
res = getaddrinfo(host, serv, &hint, &addr); /* calling getaddrinfo */
if (res != 0) { /* on error exit */
fprintf(stderr, "sockbind: resolution failed:");
// fprintf(stderr, "host %s, service %s, protocol %d", host, serv, prot);
fprintf(stderr, " %s\n", gai_strerror(res));
- errno = 0; /* clear errno */
+ errno = 0; /* clear errno */
return -1;
}
- /* loop on possible addresses */
- save = addr;
- while (addr != NULL) {
+ save = addr; /* saving for freeaddrinfo */
+ while (addr != NULL) { /* loop on possible addresses */
/* get a socket */
sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
- if (sock < 0) {
- if (addr->ai_next != NULL) {
- addr=addr->ai_next;
- continue;
- } else {
- perror("sockconn: cannot create socket");
+ if (sock < 0) { /* on error */
+ if (addr->ai_next != NULL) { /* if other addresses */
+ addr=addr->ai_next; /* take next */
+ continue; /* restart cycle */
+ } else { /* else stop */
+ perror("sockbind: cannot create socket");
return sock;
}
}
/* connect the socket */
printf("Indirizzo %s\n", ip_ntop(addr, buf, sizeof(buf)));
- ;
if ( (res = bind(sock, addr->ai_addr, addr->ai_addrlen)) < 0) {
- if (addr->ai_next != NULL) {
- addr=addr->ai_next;
- close(sock);
- continue;
- } else {
- perror("sockconn: cannot connect");
+ if (addr->ai_next != NULL) { /* if other addresses */
+ addr=addr->ai_next; /* take next */
+ close(sock); /* close socket */
+ continue; /* restart cycle */
+ } else { /* else stop */
+ perror("sockbind: cannot connect");
close(sock);
return res;
}
- } else break;
+ } else break; /* ok, we are binded! */
}
- freeaddrinfo(save); /* done, release memory */
+ freeaddrinfo(save); /* done, release memory */
return sock;
}