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