Linux网络通信socket编程-------bind函数

功能

bind()函数把一个地址族中的特定地址赋给socket,也可以说是绑定ip端口和socket。当socket函数返回一个描述符时,只是存在于其协议族的空间中,并没有分配一个具体的协议地址(这里指IPv4/IPv6和端口号的组合),bind函数可以将一组固定的地址绑定到sockfd上,例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

头文件和参数
# include <sys.types.h>
# include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

返回值:(记得要判断)
函数调用成功返回0,失败返回-1,并设置error
在这里插入图片描述

参数分析:

1.函数的三个参数分别为:sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。

2.addr:(大端模式–网络字节序)一个const struct sockaddr 指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是:
struct sockaddr_in {
sa_family_t sin_family; /
address family: AF_INET /
in_port_t sin_port; /
port in network byte order /
struct in_addr sin_addr; /
internet address */
};

/* Internet address. /
struct in_addr {
uint32_t s_addr; /
address in network byte order */
};

这里,为了统一地址结构的表示方法,统一接口函数,使得不同的地址结构可以被bind()、connect()、recvfrom()、sendto()等函数调用。一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。也就是说这里会进行类型强转
类似这样:bind(xxx, (struct sockaddr*)&server, sizeof(server));

3.addrlen:对应的是地址的长度。

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

在这里插入图片描述

对于使用这个bind函数,主要在于参数二,它是个结构体,而且我们还是用这个sockaddr_in结构体,然后再类型转换,这里有篇转载文章,专门讲这两个结构体,请点击查阅

Linux中SOCKET编程中INADDR_ANY的含义

INADDR_ANY选项
网络编程中常用到bind函数,需要绑定IP地址,这时可以设置INADDR_ANY
INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。
也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。
比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某
个端口,那他要监听哪个网卡地址的端口呢?如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网
卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个
套接字进行数据交换,这样岂不是很繁琐?
所以你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,
只要是绑定的端口号过来的数据,都可以接收到。
当然, 客户端connect时,不能使用INADDR_ANY选项。必须指明要连接哪个服务器IP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值