bind 子例程
用途
将名称绑定到套接字。
库
标准 C 库 (libc.a)
语法
#include <sys/socket.h>
描述
绑定 子例程将 姓名 参数指定给未命名的套接字。 由 套接字 子例程创建的套接字是未命名的; 它们仅由其地址系列标识。 连接套接字的子例程要么指定名称,要么使用未命名的套接字。
对于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));