summaryrefslogtreecommitdiffstats
path: root/man3/getaddrinfo.3
diff options
context:
space:
mode:
Diffstat (limited to 'man3/getaddrinfo.3')
-rw-r--r--man3/getaddrinfo.370
1 files changed, 35 insertions, 35 deletions
diff --git a/man3/getaddrinfo.3 b/man3/getaddrinfo.3
index 5af0709fc..8c4de3b16 100644
--- a/man3/getaddrinfo.3
+++ b/man3/getaddrinfo.3
@@ -656,9 +656,9 @@ The programs are an echo server and client for UDP datagrams.
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
-
+\&
#define BUF_SIZE 500
-
+\&
int
main(int argc, char *argv[])
{
@@ -669,12 +669,12 @@ main(int argc, char *argv[])
struct addrinfo hints;
struct addrinfo *result, *rp;
struct sockaddr_storage peer_addr;
-
+\&
if (argc != 2) {
fprintf(stderr, "Usage: %s port\en", argv[0]);
exit(EXIT_FAILURE);
}
-
+\&
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
@@ -683,48 +683,48 @@ main(int argc, char *argv[])
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
-
+\&
s = getaddrinfo(NULL, argv[1], &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\en", gai_strerror(s));
exit(EXIT_FAILURE);
}
-
+\&
/* getaddrinfo() returns a list of address structures.
Try each address until we successfully bind(2).
If socket(2) (or bind(2)) fails, we (close the socket
and) try the next address. */
-
+\&
for (rp = result; rp != NULL; rp = rp\->ai_next) {
sfd = socket(rp\->ai_family, rp\->ai_socktype,
rp\->ai_protocol);
if (sfd == \-1)
continue;
-
+\&
if (bind(sfd, rp\->ai_addr, rp\->ai_addrlen) == 0)
break; /* Success */
-
+\&
close(sfd);
}
-
+\&
freeaddrinfo(result); /* No longer needed */
-
+\&
if (rp == NULL) { /* No address succeeded */
fprintf(stderr, "Could not bind\en");
exit(EXIT_FAILURE);
}
-
+\&
/* Read datagrams and echo them back to sender. */
-
+\&
for (;;) {
char host[NI_MAXHOST], service[NI_MAXSERV];
-
+\&
peer_addrlen = sizeof(peer_addr);
nread = recvfrom(sfd, buf, BUF_SIZE, 0,
(struct sockaddr *) &peer_addr, &peer_addrlen);
if (nread == \-1)
continue; /* Ignore failed request */
-
+\&
s = getnameinfo((struct sockaddr *) &peer_addr,
peer_addrlen, host, NI_MAXHOST,
service, NI_MAXSERV, NI_NUMERICSERV);
@@ -733,7 +733,7 @@ main(int argc, char *argv[])
nread, host, service);
else
fprintf(stderr, "getnameinfo: %s\en", gai_strerror(s));
-
+\&
if (sendto(sfd, buf, nread, 0, (struct sockaddr *) &peer_addr,
peer_addrlen) != nread)
{
@@ -754,9 +754,9 @@ main(int argc, char *argv[])
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
-
+\&
#define BUF_SIZE 500
-
+\&
int
main(int argc, char *argv[])
{
@@ -766,77 +766,77 @@ main(int argc, char *argv[])
ssize_t nread;
struct addrinfo hints;
struct addrinfo *result, *rp;
-
+\&
if (argc < 3) {
fprintf(stderr, "Usage: %s host port msg...\en", argv[0]);
exit(EXIT_FAILURE);
}
-
+\&
/* Obtain address(es) matching host/port. */
-
+\&
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
hints.ai_flags = 0;
hints.ai_protocol = 0; /* Any protocol */
-
+\&
s = getaddrinfo(argv[1], argv[2], &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\en", gai_strerror(s));
exit(EXIT_FAILURE);
}
-
+\&
/* getaddrinfo() returns a list of address structures.
Try each address until we successfully connect(2).
If socket(2) (or connect(2)) fails, we (close the socket
and) try the next address. */
-
+\&
for (rp = result; rp != NULL; rp = rp\->ai_next) {
sfd = socket(rp\->ai_family, rp\->ai_socktype,
rp\->ai_protocol);
if (sfd == \-1)
continue;
-
+\&
if (connect(sfd, rp\->ai_addr, rp\->ai_addrlen) != \-1)
break; /* Success */
-
+\&
close(sfd);
}
-
+\&
freeaddrinfo(result); /* No longer needed */
-
+\&
if (rp == NULL) { /* No address succeeded */
fprintf(stderr, "Could not connect\en");
exit(EXIT_FAILURE);
}
-
+\&
/* Send remaining command\-line arguments as separate
datagrams, and read responses from server. */
-
+\&
for (size_t j = 3; j < argc; j++) {
len = strlen(argv[j]) + 1;
/* +1 for terminating null byte */
-
+\&
if (len > BUF_SIZE) {
fprintf(stderr,
"Ignoring long message in argument %zu\en", j);
continue;
}
-
+\&
if (write(sfd, argv[j], len) != len) {
fprintf(stderr, "partial/failed write\en");
exit(EXIT_FAILURE);
}
-
+\&
nread = read(sfd, buf, BUF_SIZE);
if (nread == \-1) {
perror("read");
exit(EXIT_FAILURE);
}
-
+\&
printf("Received %zd bytes: %s\en", nread, buf);
}
-
+\&
exit(EXIT_SUCCESS);
}
.EE