bind 子例程

用途

将名称绑定到套接字。

标准 C 库 (libc.a)

语法

#include <sys/socket.h>
int bind ( Socket,  Name,  NameLength)
int Socket;
const struct sockaddr *Name;
socklen_t NameLength;

描述

绑定 子例程将 姓名 参数指定给未命名的套接字。 由 套接字 子例程创建的套接字是未命名的; 它们仅由其地址系列标识。 连接套接字的子例程要么指定名称,要么使用未命名的套接字。

对于UNIX域套接字,只有当调用connect的进程拥有绑定调用创建的套接字文件的读写权限时,connect调用才能成功。 权限由创建该文件的进程的 Umask 值确定。

应用程序可以使用 getsockname 子例程检索指定的套接字名称。

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

UNIX 域中绑定名称将在文件系统中创建套接字,当不再需要该套接字时,调用者必须将其删除。

注: 当您对应用程序启用 IPv6 时,也支持 IPv4 地址。 您可以使用 AF_INET6 套接字来发送和接收 IPv4 和 IPv6 包,因为 AF_INET6 套接字能够处理与 IPv4 和 IPv6 主机的通信。 但是,您必须将先前传递至套接字调用的 IPv4 地址的地址格式转换为 IPv4-mapped IPv6 地址格式。 例如,必须将 sockaddr_in 结构中的 10.1.1.1 转换为 sockaddr_in6 结构中的 ::ffff:10.1.1.1 。

参数

描述
套接字 指定要绑定的套接字的套接字描述符 (整数)。
名称 指向地址结构,该地址结构指定套接字应绑定到的地址。 /usr/include/sys/socket.h 文件定义 sockaddr 地址结构。 索卡德尔 结构包含特定于 套接字 子例程中提供的地址格式和协议的标识。
NameLength 指定套接字地址结构的长度。

返回值

成功完成后, 绑定 子例程将返回值 0。

如果 绑定 子例程不成功,那么子例程处理程序执行以下操作:

  • 向调用程序返回-1。
  • 将指示特定错误的错误代码移动到 错误号 全局变量中。 有关 错误号 变量的进一步说明,请参阅 通信编程概念中的 "错误通知对象类"。

错误代码

如果发生以下任何错误,那么 绑定 子例程不成功:

描述
EACCES 所请求的地址受保护,并且当前用户没有访问该地址的许可权。
电子地址使用 指定的地址已在使用中。
电子邮件地址不可用 指定的地址在本地机器上不可用。
电弧炉辅助系统 对于指定套接字的地址系列而言,指定的地址不是有效地址。
再次 瞬态端口已在使用中,并且不可用。
EBADF 插座 参数是无效的。
EDESTADRREQ 地址 参数是一个空指针。
Efault Address 参数不在 UserAddress 空间的可写部分中。
EINVAL 该套接字已绑定到地址。
ENOBUF 可用缓冲区空间不足。
ENODEV 指定的设备不存在。
ENOTSOCK 插座 参数引用的是文件,而不是套接字。
EOPNOTSUPP 插座 参数引用的套接字不支持地址绑定。

示例

以下程序片段说明了如何使用 绑定 子例程来绑定名称 "/tmp/zan/" 到 UNIX 域套接字。

#include <sys/un.h>
.
.
.
struct sockaddr_un addr;
.
.
.
strcpy(addr.sun_path, "/tmp/zan/");
addr.sun_len = strlen(addr.sun_path);
addr.sun_family = AF_UNIX; 
bind(s,(struct sockaddr*)&addr, SUN_LEN(&addr));