(Same as send())
sendmsg
Prototype:
#include <sys/socket.h>
#include <resolv.h>
#include <sys/uio.h>
int sendmsg(int sockfd, const struct msghdr *msg,
    unsigned int options);
General Description: Assemble a message from several blocks of data. This routine takes the data the iovec structure and creates single message. If the msg_name points to a real sockaddr, the routine sends the message connectionless. If NULL, the routine assumes that the socket is connected.
Return Value: This call returns the total number of bytes sent or -1 if error (check errno for more information).
Parameters
sockfd The open socket descriptor.
msg This is a reference to a msghdr structure that holds destination, flags and messages. The structure definitions follow:struct iovec{void *iov_base; /* Buffer start */__kernel_size_t iov_len; /* Buffer length */};
struct msghdr{__ptr_t msg_name; /* Dest address */socklen_t msg_namelen; /* Address length */struct iovec *msg_iov; /* Buffers vector */size_t msg_iovlen; /* Vector length */__ptr_t msg_control; /* Ancillary data */size_t msg_controllen; /* Ancillary data len */int msg_flags; /* Received msg flags */};The ancillary data allows the program to transfer special data like file descriptors.
options Message-controlling flags (same as send()).
Possible Errors
Examples
int i, sd, len, bytes;
char buffer[MSGS][100];
struct iovec io[MSGS];
struct msghdr msg;
struct sockaddr_in addr;

sd = socket(PF_INET, SOCK_DGRAM, 0);
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_aton(&addr.sin_addr, "127.0.0.1");
bzero(&msg, sizeof(msg));
msg.msg_name = &addr;
msg.msg_namelen = sizeof(addr);
for ( i = 0; i < MSGS; i++ )
{
    io[i].iov_base = buffer[i];
    sprintf(buffer[i], "Buffer #%d: this is a test\n", i);
    io[i].iov_len = strlen(buffer[i]);
}
msg.msg_iov = io;
msg.msg_iovlen = MSGS;
if ( (bytes = sendmsg(sd, &msg, 0)) < 0 )
	perror("sendmsg");