Skip to content
On this page

bind(2)


标签:linux/network  

函数原型

功能:将 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 函数库报错:

  1. bind: Address already in use ---> 端口号被占用,换一个端口号即可
  2. bind: Cannot assign requested address ---> 无法绑定该 IP 地址,检查本机 IP

相关笔记

Last updated: