函数原型
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
为socket指定一个地址, 一般服务端的socket需要调用bind()指定地址,以表明要在哪个地址/端口接收数据。
参数简介
sockfd
socket描述符,标识一个socket.
addr
socket地址,传入的地址需要强制转换成struct sockaddr类型,定义如下:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
实际传入的地址类型由协议族决定,如AF_INET地址类型为struct sockaddr_in
struct sockaddr_in {
__kernel_sa_family_t sin_family; /* Address family */
__be16 sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
}
AF_UNIX地址类型为struct sockaddr_un
#define UNIX_PATH_MAX 108
struct sockaddr_un {
__kernel_sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* pathname */
};
返回值
成功,返回0 ;失败,返回-1,并设置 errno.
errno的值如下:
EACCES 非root用户,无权访问.
EADDRINUSE 地址已使用
EBADF 非法的描述符.
EINVAL 地址已绑定到一个socket
ENOTSOCK sockfd 不是socket类型文件.