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,并且不存在要接受的连接。 |