send 子例程

用途

从已连接的套接字发送消息。

标准 C 库 (libc.a)

语法

#include <sys/types.h>
#include <sys/socketvar.h>
#include <sys/socket.h>
int send (Socket,
Message, Length, Flags)
int  Socket;
const void * Message;
size_t  Length;
int  Flags;

描述

子例程仅在套接字连接时发送消息。 套接字上的此子例程不是线程安全的。 森德 tosendmsg 子例程可以与未连接或已连接的套接字配合使用。

要在套接字上广播,首先使用 SO_BROADCAST 选项发出 塞佐克托特 子例程以获取广播许可权。

使用 长度 参数来指定消息的长度。 如果消息过长,无法通过底层协议传递,那么系统将返回错误,并且不会传输消息。

子例程中,未指示交付失败。 返回值为-1表示本地检测到一些错误。

如果在发送套接字处没有可用于保存要发送的消息的空间,那么除非套接字处于非阻塞 I/O 方式,否则 子例程将阻塞。 请使用 选择 子例程来确定何时可以发送更多数据。

可以使用定义的 COMPAT_43 来编译套接字应用程序。 这将使 sockaddr 结构 BSD 4.3 兼容。 有关更多详细信息,请参阅 socket.h

参数

描述
套接字 指定套接字的唯一名称。
消息 指示要发送的消息的地址。
长度 指定消息的长度 (以字节为单位)。
标志 使发送方能够控制消息的传输。 用于发送调用的 标志 参数是通过对以下列表中显示的一个或两个值进行逻辑 OR 运算而形成的:
MSG_OOB
处理支持 SOCK_STREAM 通信的套接字上的频带外数据。
MSG_DONTROUTE
不使用路由表发送。
MSG_MPEG2
表示此块是 MPEG2 块。 此标志仅有效 SOCK_CONN_DGRAM 类型的套接字。

返回值

成功完成后, 子例程返回发送的字符数。

如果 子例程不成功,那么该子例程处理程序将执行以下功能:

  • 会向调用程序返回-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 套接字标记为非阻塞,并且不存在要接受的连接。