18.3.4 套接字的名字
要使socket()调用创建的套接字能够被其他进程使用,程序就必须给该套接字起个名字。AF_UNIX套接字会关联到一个文件系统的路径名上去,AF_INET套接字将关联到一个IP端口号上去。为套接字命名可使用bind()系统调用,它的一般形式如下:
int bind(int socket, const struct sockaddr *address, size_t address_len);
bind()系统调用的作用是把参数address中给出的地址赋值给与文件描述符socket相关联的未命名套接字。地址结构的长度是通过address_len参数传递的。地址的长度和类型取决于地址族。bind()调用需要用一个与之对应的地址结构指针指向真正的地址类型。该调用成功时将返回0,否则返回–1,并将errno变量设置为表18.3中的值。
表18.3 bind()系统调用返回的错误代码
代 码 | 说 明 |
EBADF | 文件描述符无效 |
ENOTSOCK | 该文件描述符代表的不是一个套接字 |
EINVAL | 该文件描述符是一个已命名套接字 |
EADDRNOTAVAIL | 地址不可用 |
EADDRINUSE | 该地址已经绑定一个套接字 |
AF_UNIX套接字对应的错误代码比上表要多出两个,分别是EACCESS,表示权限不足,不能创建文件系统中使用的名字;ENOTDIR/ENAMETOOLONG,表示路径错误或路径名太长。