| #include <netinet/ip.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| |
| #define PORT 12345 |
| |
| int |
| main (int argc, char **argv) |
| { |
| int fd; |
| struct sockaddr_in sa; |
| struct msghdr msg; |
| struct iovec iov[2]; |
| |
| fd = socket (AF_INET, SOCK_DGRAM, 0); |
| if (fd == -1) |
| { |
| perror ("socket()"); |
| exit (EXIT_FAILURE); |
| } |
| |
| sa.sin_family = AF_INET; |
| sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK); |
| sa.sin_port = htons (PORT); |
| if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1) |
| { |
| perror ("connect ()"); |
| exit (EXIT_FAILURE); |
| } |
| |
| // Create msg_hdr. Oops, we forget to set msg_name... |
| msg.msg_namelen = 0; |
| iov[0].iov_base = "one"; |
| iov[0].iov_len = 3; |
| iov[1].iov_base = "two"; |
| iov[1].iov_len = 3; |
| msg.msg_iov = &iov[0]; |
| msg.msg_iovlen = 2; |
| msg.msg_control = NULL; |
| msg.msg_controllen = 0; |
| |
| size_t s = sendmsg (fd, &msg, 0); |
| |
| // Note how we now do set msg_name, but don't set msg_flags. |
| // The msg_flags field is ignored by sendmsg. |
| msg.msg_name = NULL; |
| |
| fd = socket (AF_INET, SOCK_DGRAM, 0); |
| if (fd == -1) |
| { |
| perror ("socket()"); |
| exit (EXIT_FAILURE); |
| } |
| |
| if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1) |
| { |
| perror ("connect ()"); |
| exit (EXIT_FAILURE); |
| } |
| |
| s = sendmsg (fd, &msg, 0); |
| if (s == -1) |
| { |
| perror ("sendmsg ()"); |
| exit (EXIT_FAILURE); |
| } |
| else |
| fprintf (stderr, "sendmsg: %d\n", (int) s); |
| |
| return 0; |
| } |