bind() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

bind() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

bind - 将名称绑定到套接字

语法

#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *my_addr ", socklen_t " addrlen );

描述

bind() 为套接字 sockfd 提供本地地址 my_addrmy_addr 长度为 addrlen 字节。传统上,这被称为\(为套接字分配名称”。\(当使用 socket(2) 创建套接字时,它存在于名称空间(地址族)中,但没有分配名称。

通常需要在 SOCK_STREAM 套接字接收连接之前(参见 accept(2))使用 bind() 分配本地地址。

名称绑定中使用的规则在不同的地址族之间有所不同。请参阅第 7 节中的手册条目以获取详细信息。对于 AF_INET,请参阅 ip(7);对于 AF_INET6,请参阅 ipv6(7);对于 AF_UNIX,请参阅 unix(7);对于 AF_APPLETALK,请参阅 ddp(7);对于 AF_PACKET,请参阅 packet(7);对于 AF_X25,请参阅 x25(7);对于 AF_NETLINK,请参阅 netlink(7)。

my_addr 参数传递的实际结构将取决于地址族。sockaddr 结构定义如下:

struct sockaddr { sa_family_t sa_family; char sa_data[14]; }

此结构的唯一目的是强制转换 my_addr 中传递的结构指针,以避免编译器警告。以下示例显示了在 Unix(AF_UNIX)域中绑定套接字时如何执行此操作

#include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdlio.h> #define MY_SOCK_PATH "/somepath" int main(int argc, char *argv[]) { int sfd; struct sockaddr_un addr; sfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sfd == -1) { perror("socket"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(struct sockaddr_un)); /* Clear structure */ addr.sun_family = AF_UNIX; strncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path) - 1); if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) == -1) { perror("bind"); exit(EXIT_FAILURE); } ... }

返回值

成功时,返回 0。失败时,返回 -1,并适当地设置 errno

错误

错误代码描述
EACCES 地址受保护,并且用户不是超级用户。
EADDRINUSE 给定的地址已在使用。
EBADF sockfd 不是有效的描述符。
EINVAL 套接字已绑定到地址。
ENOTSOCK sockfd 是文件的描述符,而不是套接字。
以下错误特定于 UNIX 域(AF_UNIX)套接字
EACCES 路径前缀的某个组件上的搜索权限被拒绝。(另请参阅 path_resolution(2)。)
EADDRNOTAVAIL 请求了不存在的接口,或者请求的地址不是本地的。
EFAULT my_addr 指向用户可访问地址空间之外。
EINVAL addrlen 错误,或者套接字不在 AF_UNIX 族中。
ELOOP 在解析 my_addr 时遇到太多符号链接。
ENAMETOOLONG my_addr 太长。
ENOENT 文件不存在。
ENOMEM 内核内存不足。
ENOTDIR 路径前缀的某个组件不是目录。
EROFS 套接字 inode 将驻留在只读文件系统上。

错误

未描述透明代理选项。

符合标准

SVr4、4.4BSD(bind() 函数首次出现在 4.2BSD 中)。

注意

bind() 的第三个参数实际上是 int(这是 4.x BSD 和 libc4 和 libc5 所具有的)。一些 POSIX 混淆导致了当前的 socklen_t,glibc 也使用它。另请参阅 accept(2)。

另请参阅



previous next Printer Friendly

广告


  

广告



广告