版权所有 © 2014 tutorialspoint
bind - 将名称绑定到套接字
#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *my_addr ", socklen_t " addrlen );
bind() 为套接字 sockfd 提供本地地址 my_addr。my_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。
未描述透明代理选项。
SVr4、4.4BSD(bind() 函数首次出现在 4.2BSD 中)。
bind() 的第三个参数实际上是 int(这是 4.x BSD 和 libc4 和 libc5 所具有的)。一些 POSIX 混淆导致了当前的 socklen_t,glibc 也使用它。另请参阅 accept(2)。
accept (2)
connect (2)
getsockname (2)
listen (2)
path_resolution (2)
socket (2)
广告