名称
bind - 绑定一个名字到一个套接字
内容简介
#include#include int bind(int sockfd, const struct sockaddr *my_addr ", socklen_t " addrlen )
描述
bind() gives the socket%uA0sockfd%uA0the local address%uA0my_addr.%uA0my_addr%uA0is%uA0addrlen%uA0bytes long. Traditionally, this is called%uA0assigning a name to a socket.
It is normally necessary to assign a local address using%uA0bind() before a%uA0SOCK_STREAMsocket may receive connections (see%uA0accept(2)).
The rules used in name binding vary between address families. Consult the manual entries in Section 7 for detailed information. For%uA0AF_INET%uA0see%uA0ip(7), for%uA0AF_INET6%uA0seeipv6(7), for%uA0AF_UNIX%uA0see%uA0unix(7), for%uA0AF_APPLETALK%uA0see%uA0ddp(7), for%uA0AF_PACKET%uA0seepacket(7), for%uA0AF_X25%uA0see%uA0x25(7) and for%uA0AF_NETLINK%uA0see%uA0netlink(7).
The actual structure passed for the%uA0my_addr%uA0argument will depend on the address family. The%uA0sockaddr%uA0structure is defined as something like:
#include#include #include #include #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) } ... }
The only purpose of this structure is to cast the structure pointer passed in%uA0my_addr%uA0in order to avoid compiler warnings. The following example shows how this is done when binding a socket in the Unix (AF_UNIX) domain:
struct sockaddr { sa_family_t sa_family char sa_data[14] }
返回值
On success, zero is returned. On error, -1 is returned, and%uA0errno%uA0is set appropriately.
错误
Error Code | 描述 |
---|---|
EACCES | The address is protected, and the user is not the superuser. |
EADDRINUSE | The given address is already in use. |
EBADF | sockfd%uA0is not a valid descriptor. |
EINVAL | The socket is already bound to an address. |
ENOTSOCK | sockfd%uA0is a descriptor for a file, not a socket. |
The following errors are specific to UNIX domain (AF_UNIX) sockets: | |
EACCES | Search permission is denied on a component of the path prefix. (See also%uA0path_resolution(2).) |
EADDRNOTAVAIL | A non-existent interface was requested or the requested address was not local. |
EFAULT | my_addr%uA0points outside the user’s accessible address space. |
EINVAL | The%uA0addrlen%uA0is wrong, or the socket was not in the%uA0AF_UNIXfamily. |
ELOOP | Too many symbolic links were encountered in resolving%uA0my_addr. |
ENAMETOOLONG | my_addr%uA0is too long. |
ENOENT | The file does not exist. |
ENOMEM | Insufficient kernel memory was available. |
ENOTDIR | A component of the path prefix is not a directory. |
EROFS | The socket inode would reside on a read-only file system. |
BUGS
透明代理的选择没有被描述。
遵循于
SVr4, 4.4BSD (the%uA0bind() function first appeared in 4.2BSD).
注意
The third argument of%uA0bind() is in reality an%uA0int%uA0(and this is what 4.x BSD and libc4 and libc5 have). Some POSIX confusion resulted in the present%uA0socklen_t, also used by glibc. See also%uA0accept(2).