1#include <netinet/ip.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include <sys/types.h>
6#include <sys/socket.h>
7
8#define PORT 12345
9
10int
11main (int argc, char **argv)
12{
13  int fd;
14  struct sockaddr_in sa;
15  struct msghdr msg;
16  struct iovec iov[2];
17
18  fd = socket (AF_INET, SOCK_DGRAM, 0);
19  if (fd == -1)
20    {
21      perror ("socket()");
22      exit (EXIT_FAILURE);
23    }
24
25  sa.sin_family = AF_INET;
26  sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
27  sa.sin_port = htons (PORT);
28  if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1)
29    {
30      perror ("connect ()");
31      exit (EXIT_FAILURE);
32    }
33
34  // Create msg_hdr. Oops, we forget to set msg_name...
35  msg.msg_namelen = 0;
36  iov[0].iov_base = "one";
37  iov[0].iov_len = 3;
38  iov[1].iov_base = "two";
39  iov[1].iov_len = 3;
40  msg.msg_iov = &iov[0];
41  msg.msg_iovlen = 2;
42  msg.msg_control = NULL;
43  msg.msg_controllen = 0;
44
45  size_t s = sendmsg (fd, &msg, 0);
46
47  // Note how we now do set msg_name, but don't set msg_flags.
48  // The msg_flags field is ignored by sendmsg.
49  msg.msg_name = NULL;
50
51  fd = socket (AF_INET, SOCK_DGRAM, 0);
52  if (fd == -1)
53    {
54      perror ("socket()");
55      exit (EXIT_FAILURE);
56    }
57
58  if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1)
59    {
60      perror ("connect ()");
61      exit (EXIT_FAILURE);
62    }
63
64  s = sendmsg (fd, &msg, 0);
65  if (s == -1)
66    {
67      perror ("sendmsg ()");
68      exit (EXIT_FAILURE);
69    }
70  else
71    fprintf (stderr, "sendmsg: %d\n", (int) s);
72
73  return 0;
74}
75