send 子例程
用途
从已连接的套接字发送消息。
库
标准 C 库 (libc.a)
语法
描述
派 子例程仅在套接字连接时发送消息。 套接字上的此子例程不是线程安全的。 森德 to 和 sendmsg 子例程可以与未连接或已连接的套接字配合使用。
要在套接字上广播,首先使用 SO_BROADCAST 选项发出 塞佐克托特 子例程以获取广播许可权。
使用 长度 参数来指定消息的长度。 如果消息过长,无法通过底层协议传递,那么系统将返回错误,并且不会传输消息。
在 派 子例程中,未指示交付失败。 返回值为-1表示本地检测到一些错误。
如果在发送套接字处没有可用于保存要发送的消息的空间,那么除非套接字处于非阻塞 I/O 方式,否则 派 子例程将阻塞。 请使用 选择 子例程来确定何时可以发送更多数据。
可以使用定义的 COMPAT_43 来编译套接字应用程序。 这将使 sockaddr 结构 BSD 4.3 兼容。 有关更多详细信息,请参阅 socket.h。
参数
| 项 | 描述 |
|---|---|
| 套接字 | 指定套接字的唯一名称。 |
| 消息 | 指示要发送的消息的地址。 |
| 长度 | 指定消息的长度 (以字节为单位)。 |
| 标志 | 使发送方能够控制消息的传输。 用于发送调用的 标志 参数是通过对以下列表中显示的一个或两个值进行逻辑 OR 运算而形成的:
|
返回值
成功完成后, 派 子例程返回发送的字符数。
如果 派 子例程不成功,那么该子例程处理程序将执行以下功能:
- 会向调用程序返回-1的值。
- 将错误代码 (指示特定错误) 移动到 错误号 全局变量中。
错误代码
如果发生以下任何错误,那么该子例程不成功:
| 错误 | 描述 |
|---|---|
| EACCES | 对指定套接字的写访问被拒绝,或者尝试发送广播包的套接字不具有广播功能。 |
| EADDRNOTAVAIL | 指定的地址不是有效的地址。 |
| EAFNOSUPPORT | 对于此套接字的地址系列,指定的地址不是有效地址。 |
| EBADF | 插座 参数是无效的。 |
| ECONNRESET | 对等方强制关闭了连接。 |
| EDESTADRREQ | 该套接字未处于连接方式,并且未设置对等地址。 |
| Efault | 地址 参数未包含在用户地址空间的可写部分中。 |
| EHOSTUN联系 | 无法访问该目标主机。 |
| EINTR | 在传输任何数据之前,信号已中断 派 。 |
| EINVAL | 长度 参数是无效的。 |
| EISCONN | 已连接 SOCK_DGRAM 套接字。 |
| EMSGSIZE | 消息太大,无法按套接字的要求一次性发送所有消息。 |
| ENETUNREACH | 无法访问该目标网络。 |
| ENOBUFS | 系统中没有足够的资源可用于执行该操作。 |
| ENOENT | 路径名未对现有文件进行命名,或者路径名是空字符串。 |
| ENOMEM | 内存中的可用数据空间不够大,无法保存组 /ACL 信息。 |
| ENOTSOCK | 插座 参数引用的是文件,而不是套接字。 |
| EOPNOTSUPP | 套接字自变量与不支持 标志中设置的一个或多个值的套接字关联。 |
| EPIPE | 尝试在已连接的套接字上发送,但该连接已由远程同级或该连接的此端关闭。 如果套接字的类型为 SOCK_STREAM,那么会向调用进程生成 SIGPIPE 信号。 |
| EWOULDBLOCK | 套接字标记为非阻塞,并且不存在要接受的连接。 |