上一章我们讲了connect函数,这一章我们来了解下bind函数
bind函数呢是将本地地址与套接字绑定在一起。我们来看下它的原型:
int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
我们来看下他需要哪些参数:
1、 fd:这个是套接字描述符
2、 addr:这个是本地地址
3、 len:这个是套接字地址结构的长度
bind执行成功时返回0,失败返回-1.
通常,在一个SOCK_STREAM(SOCK_STREAM是基于TCP的,数据传输比较有保障)套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名。
备注:
bind()函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind()函数,同时也避免不必要的复杂度。在一般情况下,对于服务器进程问题需要调用bind()函数,对于客户进程则不需要调用bind()函数。
绑定操作一般如下图:
![8726fa8bcf6aaa835423e8ac7cbd22cc.png](https://i-blog.csdnimg.cn/blog_migrate/ae8bbb7f8e45c0d8da9dfcd8eedda50a.jpeg)
绑定操作一般有如下几种组合方式:
![bf41a8dfb9be6cc782c6a4607e2a8b1a.png](https://i-blog.csdnimg.cn/blog_migrate/6ad1ea694fa9af5e079a3a67da2df221.jpeg)
我们来看下这几种组合:
1、 服务器指定套接字地址和公认端口号,不指定IP地址。
服务器调用函数bind时,如果设置套接字的IP地址为特殊的INADDR_ANY,表示它愿意接收来自任何网络设备接口的客户机连接。
2、服务器指定套接字地址的公认端口号和IP地址
服务器调用函数bind时,如果设置套接字IP地址为某个本地IP地址,这表示服务器只接受来自对应与这个IP地址的特定网络设备接口的客户机连接,如果这台机器只有一个网络设备接口,这和第1中情况没有区别,但当这台机器有多个网络设备接口是,可以用这种方式来限制服务器的接收范围。
3、客户机指定套接字地址的连接端口
在一般情况下,客户机不用指定自己的套接字地址的端口号,当客户机调用函数connect进行TCP连接时,系统会自动为它选择一个未用的端口号,并且用本地的iP地址来填充套接字地址中的相应项,但在有的情况下,客户机需要特定端口号,就需要绑定一个未用的端口号,如linux系统中的rlogin命令。
4、指定客户机的ip地址和连接端口号
表示客户机使用指定的网络设备接口和端口号进行通信。
5、指定客户机的IP地址
表示客户机使用指定的网络设备接口进行通信,系统自动为客户机选择一个未用的端口号。一般只有在主机有多个网络设备接口时使用。