bind() gives the socket
sockfd the local address
my_addr.
my_addr is
addrlen bytes long.
Traditionally, this is called assigning 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 <stdio.h>
#include <string.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);
}
...
}