一、函数原型
#include <sys/socket.h>
int bind (int __fd, const struct sockaddr * __addr, socklen_t __len)
该函数调用之前,必创建 socket ,在 linux 内核中,socket 描述符映射为 struct socket ,该结构体中包含了该 socket 所需要的所有信息,包括 server 和 client 的 ip 和 port 等。
当通过函数 socket 创建 socket 描述符之后,实际上该描述字对应的结构体里面是没有内容的,所以为了让该 socket 动起来,就得将该结构体中所缺失的内容附上,该功能的实现 api 就是 bind 。
二、参数详解
1、__fd
socket 函数返回的描述字,指定被绑定的 socket 。
2、__addr
保存地址(ip + port 或者 绝对路径)信息的结构。包括一下三种:
(1)sockaddr
struct sockaddr
{
uint16_t sa_family;
char sa_data[14];
};
一般不直接使用,而是用它的变体 sockaddr_in 和 sockaddr_un 。
(2)sockaddr_in
struct sockaddr_in
{
//协议族
uint16_t sin_family;
//端口号(网络字节序)
uint16_t sin_port;
//IP 地址(网络字节序)
uint32_t s_addr;
//为了保持与 struct sockaddr 结构体大小相等,故填充之用。
unsigned char sin_zero[8];
};
协议族是 AF_INET 并且 socket 的类型是 SOCK_STREAM 和 SOCK_DGRAM 时使用。
(3)sockaddr_un
struct sockaddr_un
{
uint16_t sun_family;
// 绝对路径。
char sun_path[108];
};
协议族是 AF_UNIX 时使用。
3、__len
标示实际使用的存储地址信息的结构的大小,例如:
sizeof(sockaddr_in)
sizeof(sockaddr_un)
三、返回值
成功返回0,失败返回 -1 ,并置 errno 。
(SAW:Game Over!)
2万+

被折叠的 条评论
为什么被折叠?



