5、EAGAIN 此操作会令进程阻断, 但参数s 的socket 为不可阻断.
6、ENOBUFS 系统的缓冲内存不足
7、ENOMEM 核心内存不足 EINVAL 传给系统调用的参数不正确.
附属数据msg_control结构
控制信息头部本身由下面的C结构定义:
struct cmsghdr {
socklen_t cmsg_len;
int cmsg_level;
int cmsg_type;
/* u_char cmsg_data[]; */
};
其成员描述如下:
成员 描述
cmsg_len 附属数据的字节计数,这包含结构头的尺寸。这个值是由CMSG_LEN()宏计算的。
cmsg_level 这个值表明了原始的协议级别(例如,SOL_SOCKET)。
cmsg_type 这个值表明了控制信息类型(例如,SCM_RIGHTS)。
cmsg_data 这个成员并不实际存在,用来指明实际的额外附属数据所在的位置。
用sendmsg来传递数据程序实例
/*sendmsg.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc,char *argv[])
{
int ret; /* 返回值 */
int sock[2]; /* 套接字对 */
struct msghdr msg;
struct iovec iov[1];
char send_buf[100] = "it is a test";
struct msghdr msgr;
struct iovec iovr[1];
char recv_buf[100];
/* 创建套接字对 */
ret = socketpair(AF_LOCAL,SOCK_STREAM,0,sock);
if(ret == -1){
printf("socketpair err\n");
return 1;
}
/* sock[1]发送数据到本地主机 */
bzero(&msg, sizeof(msg));
msg.msg_name = NULL; /* void*类型 NULL本地地址*/
msg.msg_namelen = 0;
iov[0].iov_base = send_buf;
iov[0].iov_len = sizeof(send_buf);
msg.msg_iov = iov;//要发送或接受数据设为iov
msg.msg_iovlen = 1;//1个元素
printf("开始发送数据:\n");
printf("发送的数据为: %s\n", send_buf);
ret = sendmsg(sock[1], &msg, 0 );
if(ret == -1 ){
printf("sendmsg err\n");
return -1;
}
printf("发送成功!\n");
/* 通过sock[0]接收发送过来的数据 */
bzero(&msg, sizeof(msg));
msgr.msg_name = NULL;
msgr.msg_namelen = 0;
iovr[0].iov_base = &recv_buf;
iovr[0].iov_len = sizeof(recv_buf);
msgr.msg_iov = iovr;
msgr.msg_iovlen = 1;