Appearance
函数原型
功能:将 IP 地址和端口号绑定到套接字文件中;
(客户端不绑定的话,系统默认使用本机 IP 和随机端口,服务器必须绑定)
c
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);参数
int sockfd:指定要绑定到哪个套接字上,其实就是 socket 函数创建的文件描述符;struct sockaddr *addr:通用地址信息结构体,真实的地址信息结构体根据地址族指定。 用man 7 ip/man 7 unix查看socklen_t addrlen:真实的地址信息结构体的大小sizeof(struct sockaddr_in)
AF_INET(man 7 ip):
c
struct sockaddr_in {
sa_family_t sin_family; // 必须填AF_INET(网络)
in_port_t sin_port; // 端口号的网络字节序 1024~49151
struct in_addr sin_addr; // IP地址的网络字节序
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};该结构体的使用示例:
c
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);AF_UNIX(man 7 unix):
c
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* 该路径必须事先不存在,由 bind 产生 */
};该结构体使用示例:
c
struct sockaddr_un sun;
sun.sun_family = AF_UNIX;
strcpy(sun.sun_path, "./unix");返回值
成功,返回0;
失败,返回-1,更新 errno;
📣 bind 函数库报错:
- bind: Address already in use ---> 端口号被占用,换一个端口号即可
- bind: Cannot assign requested address ---> 无法绑定该 IP 地址,检查本机 IP