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