int
bind(
int s
, const struct sockaddr *name
, socklen_t namelen
)
)
assigns a name to an unnamed socket.
When a socket is created
with
socket(2)
it exists in a name space (address family)
but has no name assigned.
bind(
)
requests that
name
be assigned to the socket.
namelen
indicates the amount of space pointed to by
name
,
in bytes.
The rules used in name binding vary between communication domains. Consult the manual entries in section 4 for detailed information.
)
call will fail if:
EBADF
]
s
is not a valid descriptor.
ENOTSOCK
]
s
is not a socket.
EADDRNOTAVAIL
]
EADDRINUSE
]
EINVAL
]
EINVAL
]
name->sa_family
are not equivalent.
EACCES
]
EFAULT
]
name
parameter is not in a valid part of the user
address space.
The following errors are specific to binding names in the UNIX domain.
ENOTDIR
]
ENAMETOOLONG
]
NAME_MAX
characters, or an entire path name exceeded
PATH_MAX
characters.
ENOENT
]
ELOOP
]
EIO
]
EROFS
]
EISDIR
]
)
function call appeared in
4.2BSD.
)
was changed in
NetBSD1.4
to prevent the binding of a socket to the same port as an existing
socket when all of the following is true:
INADDR_ANY
,
INADDR_ANY
with
SO_REUSEPORT
set.
This prevents an attack where a user could bind to a port with
the host's IP address (after setting
SO_REUSEADDR
)
and
`steal'
packets destined for a server that bound to the
same port with
INADDR_ANY
.
bind()
was changed in
NetBSD4.0
to honor the user's umask when binding sockets in the local domain.
This was done to match the behavior of other operating systems,
including
FreeBSD,
OpenBSD,
and
Linux, and to improve compatibility with some third-party software.
Please note that this behavior
is not portable.
If you must bind a local socket in a portable and secure way, you need
to make a directory with tight permissions and then create the socket
inside it.