bind()函数
名称:
bind -- 给socket 绑定一个地址名称
原型:
#include <sys/socket.h>
int bind(int socket, const struct sockaddr* address, socklen_t address_len);
描述:
bind()函数给一个 无名socket 分配一个地址名称。socket 是通过调用socket()函数创建的一个无名socket, 在刚被socket()函数创建的时候 标识他们的只是他们的协议族。
参数:
socket:
标识需要绑定地址的socket文件的 文件描述符。
address:
需要绑定给无名socket的地址指针。 其长度和结构都取决于,想要绑定的地址的 协议族。
address_len:
绑定地址address所指向结构体的真实长度。
正在使用的socket需要 进程 拥有合适的权限 才能执行bind()函数。
返回值:
0: 如果正确的为无名socket绑定了地址 则返回0;
-1: 否则返回-1, 并且置errno
错误信息:
bind() 函数将会失败如果:
[EADDRINUSE] :
需要绑定的地址正在被使用。
[EADDRNOTAVAIL]:
需要绑定的地址在本机不可用。
[EAFNOSUPPORT]:
需要绑定的地址协议族 和socket的协议族不匹配。
[EBADF]:
socket所指的并不是一个合法的文件描述符。
[EFAULT]:
address地址无法被访问。
[EINVAL]:
socket 所指的文件描述符已经绑定了一个地址,而且不支持绑定到一个新的地址上;或者socket所指的文件描述符所指代的文件已经被关闭。
[ENOTSOCK]:
socket所指向的并不是一个socket类型的文件描述符。
[EOPNOTSUPP]:
socket所指向的文件并不支持绑定到一个地址。
如果socket的协议族为AF_UNIX, bind()函数在一下条件下也会出错:
[EACCES]:
路径前缀的一个模块拒绝了 进程搜索的权限;请求创建的文件 请求写入目录的方式 被拒绝。
[EDESTADDRREQ] or [EISDIR]:
参数address 所指的是一个空指针。
[EIO]:
出现了IO错误
[ELOOP]:
翻译address里的pathname时遇到太多的符号链接
[ENAMETOOLONG]:
pathname的一部分超过了{NAME_MAX}定义的最大字符数, 或者整个pathname超过了{PATH_MAX}规定的字符数
[ENOENT]:
pathname是一个空的字符串,或者pathname的一部分所指的文件(目录)并不存在。
[ENOTDIR]:
address里的pathname的名称前缀并不是一个指定的目录。
[EROFS]:
名字将会驻留在一个只读文件系统上,也就是说不能将一个socket绑定到一个只读文件系统上的名称。
此外,以下情况下也会导致bind函数失败:
[EACCES]:
address所指定的地址受保护或者当前用户没有权限将socket绑定到address。
[EINVAL]:
address_len 参数对此协议族并不合法。
[EISCONN]:
socket已经处于链接状态。
[ENAMETOOLONG]:
符号链接的路径名的解析产生的中间结果 的 长度超过了 {PATH_MAX} 规定的字符数。
[ENOBUFS]:
没有足够的资源分配给这个call
[ENOSR]:
没有足够的STREAMS 资源来完成绑定操作。
其他:
应用程序可以通过getsockname() 函数获取分配给 socket的 地址名称。
原文出自:
http://pubs.opengroup.org/onlinepubs/007908799/xns/bind.html