1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <netinet/ip.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdlib.h>
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <string.h>
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <sys/types.h>
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <sys/socket.h>
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define PORT 12345
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmain (int argc, char **argv)
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  int fd;
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  struct sockaddr_in sa;
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  struct msghdr msg;
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  struct iovec iov[2];
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  fd = socket (AF_INET, SOCK_DGRAM, 0);
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (fd == -1)
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      perror ("socket()");
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      exit (EXIT_FAILURE);
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  sa.sin_family = AF_INET;
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  sa.sin_port = htons (PORT);
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1)
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      perror ("connect ()");
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      exit (EXIT_FAILURE);
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // Create msg_hdr. Oops, we forget to set msg_name...
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  msg.msg_namelen = 0;
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  iov[0].iov_base = "one";
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  iov[0].iov_len = 3;
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  iov[1].iov_base = "two";
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  iov[1].iov_len = 3;
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  msg.msg_iov = &iov[0];
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  msg.msg_iovlen = 2;
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  msg.msg_control = NULL;
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  msg.msg_controllen = 0;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  size_t s = sendmsg (fd, &msg, 0);
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // Note how we now do set msg_name, but don't set msg_flags.
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  // The msg_flags field is ignored by sendmsg.
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  msg.msg_name = NULL;
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  fd = socket (AF_INET, SOCK_DGRAM, 0);
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (fd == -1)
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      perror ("socket()");
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      exit (EXIT_FAILURE);
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1)
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      perror ("connect ()");
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      exit (EXIT_FAILURE);
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  s = sendmsg (fd, &msg, 0);
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (s == -1)
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      perror ("sendmsg ()");
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      exit (EXIT_FAILURE);
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  else
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    fprintf (stderr, "sendmsg: %d\n", (int) s);
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  return 0;
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
75