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