sendmsg 子例程

用途

使用消息结构从套接字发送消息。

标准 C 库 (libc.a)

语法

#include <sys/types.h>
#include <sys/socketvar.h>
#include <sys/socket.h>
int sendmsg ( Socket,  Message,  Flags)
int Socket;
const struct msghdr Message [ ];
int Flags;

描述

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 运算下列其中一个或两个值构成的:
MSG_OOB
处理支持 SOCK_STREAM的套接字上的频带外数据。
注: 以下值不用于常规用途。 它是用于调试或路由程序的管理工具。
MSG_DONTROUTE
发送而不使用路由表。
MSG_MPEG2
指示此块是 MPEG2 块。 它仅适用于 SOCK_CONN_DGRAM 类型的套接字。

返回值

成功完成时, 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 套接字被标记为无阻塞,并且不存在要接受的连接。