Copyright © tutorialspoint.com

# bind() - Unix, Linux System Call

# NAME

bind - bind a name to a socket

# SYNOPSIS

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

# DESCRIPTION

bind() gives the socket sockfd the local address my_addr. my_addr is addrlen bytes long. Traditionally, this is called \(lqassigning a name to a socket.\(rq When a socket is created with socket(2), it exists in a name space (address family) but has no name assigned.

It is normally necessary to assign a local address using bind() before a SOCK_STREAM socket may receive connections (see accept(2)).

The rules used in name binding vary between address families. Consult the manual entries in Section 7 for detailed information. For AF_INET see ip(7), for AF_INET6 see ipv6(7), for AF_UNIX see unix(7), for AF_APPLETALK see ddp(7), for AF_PACKET see packet(7), for AF_X25 see x25(7) and for AF_NETLINK see netlink(7).

The actual structure passed for the my_addr argument will depend on the address family. The sockaddr structure is defined as something like:

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

The only purpose of this structure is to cast the structure pointer passed in my_addr in order to avoid compiler warnings. The following example shows how this is done when binding a socket in the Unix (AF_UNIX) domain:

    #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);
        }
        ...
    }

# RETURN VALUE

On success, zero is returned. On error, -1 is returned, and errno is set appropriately.

# ERRORS

Error Code | Description
--- | ---
EACCES | The address is protected, and the user is not the superuser.
EADDRINUSE | The given address is already in use.
EBADF | sockfd is not a valid descriptor.
EINVAL | The socket is already bound to an address.
ENOTSOCK | sockfd is 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 path_resolution(2).)
EADDRNOTAVAIL | A non-existent interface was requested or the requested address was not local.
EFAULT | my_addr points outside the user’s accessible address space.
EINVAL | The addrlen is wrong, or the socket was not in the AF_UNIX family.
ELOOP | Too many symbolic links were encountered in resolving my_addr.
ENAMETOOLONG | my_addr is 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

The transparent proxy options are not described.

# CONFORMING TO

SVr4, 4.4BSD (the bind() function first appeared in 4.2BSD).

# NOTE

The third argument of bind() is in reality an int (and this is what 4.x BSD and libc4 and libc5 have). Some POSIX confusion resulted in the present socklen_t, also used by glibc. See also accept(2).

# SEE ALSO

- accept (2)

- connect (2)

- getsockname (2)

- listen (2)

- path_resolution (2)

- socket (2)

Copyright © tutorialspoint.com