sendmmsg 子例程

用途

通过使用消息结构从套接字发送多条消息。

语法

       #include  <sys/types.h>
       #include  <sys/socketvar.h>
       #include  <sys/socket.h>

       int sendmmsg (Socket, Messages, Flags)

       int Socket;

       struct mmsghdr Message [];

       int Flags;

描述

sendmmsg 子例程使用 mmsghdr 消息结构通过已连接或未连接的套接字发送消息。 /usr/include/sys/socket.h 文件包含 mmsghdr 消息结构并定义结构成员。 此子例程是 sendmsg 子例程的扩展。

参数

套接字
指定套接字描述符。
消息
指向包含要发送的消息的 mmsghdr 消息结构的数组。
标志
允许发送方控制消息的传输。 用于发送调用的 Flags 参数通过对标志值进行逻辑 OR 运算来构成。 sendmmsg 子例程接受与 sendmsg 子例程相同的标志值。 sys/socket.h 文件包含 Flags 参数。

返回值

成功完成时, sendmmsg 子例程将返回已发送的消息数。

sendmmsg 子例程更新每个 mmsghdr 结构的 msg_len 属性,以指示从相应消息发送的字节数。

如果 sendmmsg 子例程不成功,那么系统处理程序将执行以下函数:

  • 向调用程序返回-1。
  • 将指示特定错误的错误代码移动到 错误号 全局变量中。

错误代码

如果发生以下任何错误,那么 sendmmsg 子例程将失败:

错误 描述
EACCES 拒绝对指定套接字的写访问,或者正在尝试发送广播包的套接字不具有广播功能。
EADDRNOTAVAIL 指定的地址不是有效的地址。
EAFNOSUPPORT 对于套接字的地址系列,指定的地址不是有效的地址。
EBADF Socket 参数无效。
ECONNRESET 对等方强制关闭了连接。
EDESTADRREQ 该套接字未处于连接方式,并且未设置其对等地址。
Efault Address 参数不在用户地址空间的可写部分中。
EHOSTUN联系 无法访问该目标主机。
EINTR 在传输任何数据之前,信号中断了 sendmmsg 子例程。
EINVAL msghdr 结构的长度无效。
EISCONN SOCK_DGRAM 套接字已连接。
EMSGSIZE 消息太大,无法一起发送 (根据套接字需求) ,或者 Messages 参数指向的 msghdr 结构的 msg_iovlen 成员小于或等于 0 或大于 IOV_MAX 值。
ENOENT 路径名没有指向现有文件,或者路径名是空字符串。
ENETUNREACH 无法访问该目标网络。
ENOBUFS 对于内部数据结构,系统内存已耗尽。
ENOMEM 内存中的可用数据空间不够大,无法保存组信息或访问控制表 (ACL) 信息。
ENOPROTOOPT 该协议不支持 64 位。
ENOTCONN 该套接字处于连接方式,但未连接。
ENOTSOCK Socket 参数引用的是文件,而不是套接字。
EOPNOTSUPP Socket 自变量与套接字相关联,该套接字不支持 Flags 参数中设置的一个或多个值。
EPIPE 尝试在已连接的套接字上发送,但远程同级或该连接的套接字端关闭了该连接。 如果套接字的类型为 SOCK_STREAM,那么会向调用进程生成 SIGPIPE 信号。
EWOULDBLOCK 套接字标记为 nonblocking,并且不存在要接受的连接。