sendmsg 子例程
用途
使用消息结构从套接字发送消息。
库
标准 C 库 (libc.a)
语法
描述
sendmsg 子例程使用 msghdr 消息结构通过已连接或未连接的套接字发送消息。 /usr/include/sys/socket.h 文件包含 msghdr 结构并定义结构成员。 在 BSD 4.4中,已修改 msghdr 消息结构的大小和成员。 想要启动旧结构的应用程序需要在定义 COMPAT_43 的情况下进行编译。 缺省行为是 BSD 4.4的行为。
要在套接字上广播,应用程序必须首先使用 SO_BROADCAST 选项发出 setsockopt 子例程以获取广播许可权。
sendmsg 子例程仅支持 15 个消息元素。
必须在将 _BSD 宏设置为特定值的情况下编译包含 sendmsg 子例程的所有应用程序。 可接受的值为 43 和 44。 此外,所有套接字应用程序都必须包含 BSD libbsd.a 库。
sendmsg 例程支持 IPv6的高级套接字 API 中定义的 IPv6 辅助数据元素。
参数
| 项 | 描述 |
|---|---|
| 套接字 | 指定套接字描述符。 |
| 消息 | 指向包含要发送的消息的 msghdr 消息结构。 |
| 标志 | 允许发送方控制消息传输。 sys/socket.h 文件包含 Flags 参数。 用于发送调用的 Flags 参数是通过逻辑 OR 运算下列其中一个或两个值构成的:
注: 以下值不用于常规用途。 它是用于调试或路由程序的管理工具。
|
返回值
成功完成时, sendmsg 子例程返回发送的字符数。
如果 sendmsg 子例程不成功,那么系统处理程序将执行以下函数:
- 会向调用程序返回-1的值。
- 将指示特定错误的错误代码移动到 errno 全局变量中。
错误代码
如果发生以下任何错误,那么 sendmsg 子例程将失败:
| 错误 | 描述 |
|---|---|
| EACCES | 拒绝对指定套接字的写访问,或者尝试发送广播包的套接字不具有广播功能。 |
| EADDRNOTAVAIL | 指定的地址不是有效的地址。 |
| EAFNOSUPPORT | 指定的地址不是此套接字的地址系列的有效地址。 |
| EBADF | Socket 参数无效。 |
| ECONNRESET | 同级强制关闭了连接。 |
| EDESTADDRREQ | 套接字未处于连接方式,并且未设置其对等地址。 |
| Efault | Address 参数不在用户地址空间的可写部分中。 |
| EHOSTUN联系 | 无法访问目标主机。 |
| EINTR | 在传输任何数据之前,信号中断了 sendmsg 子例程。 |
| EINVAL | msghdr 结构的长度无效。 |
| EISCONN | SOCK_DGRAM 套接字已连接。 |
| EMSGSIZE | 消息太大,无法一次性全部发送 (根据套接字需要) ,或者 Messages 参数指向的 msghdr 结构的 msg_iovlen 成员小于或等于 0 或大于 IOV_MAX。 |
| ENOENT | 路径名未指向现有文件,或者路径名为空字符串。 |
| ENETUNREACH | 无法访问目标网络。 |
| ENOBUFS | 系统耗尽了内部数据结构的内存。 |
| ENOMEM | 内存中的可用数据空间不够大,无法保存组或访问控制表 (ACL) 信息。 |
| ENOPROTOOPT | 该协议不受 64 位支持。 |
| ENOTCONN | 套接字处于连接方式,但未连接。 |
| ENOTSOCK | Socket 参数引用的是文件,而不是套接字。 |
| EOPNOTSUPP | 套接字自变量与不支持标志中设置的一个或多个值的套接字相关联。 |
| EPIPE | 尝试在已连接的套接字上发送,但该连接已由远程同级或此连接端关闭。 如果套接字的类型为 SOCK_STREAM,那么将向调用进程生成 SIGPIPE 信号。 |
| EWOULDBLOCK | 套接字被标记为无阻塞,并且不存在要接受的连接。 |