网络编程之bind()的未解之谜

简介: 初识bind() 相信大家还记得我们之前写到的服务器函,下面博主还是给出之前服务前端的函数调用顺序。

初识bind()

    相信大家还记得我们之前写到的服务器函,下面博主还是给出之前服务前端的函数调用顺序。

服务器端:
socket()-->bind( )-->listen()-->accept()-->read()/write()--->close()
socket()//创建套接字
bind()//分配套接字地址
listen()//等待连接请求状态
accept()//允许连接
read()/write()//进行数据交换
close()//断开连接

    上一篇博客博主已经分享了socket()函数了,那么现在我们就来讲讲什么是bind()函数。

首先我们给出bind()函数各个参数的含义。

#include <sys/types.h> 
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数的含义
  第一个参数 int sockfd:
      socket文件描述符
  第二个参数 const struct  addr:
      构造出IP地址加端口号
  第三个参数 socklen_t   addrlen:
      sizeof(addr)长度
返回值:
  成功返回0,失败返回-1, 设置errno

服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号


     bind()的作用是将参数sockfd和addr(端口号和地址)绑定在一起,使sockfd这个用于网络通讯的文件描述符监听addr所描述的地址和端口号。addr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度。


第一个参数

    第一个参数相信大家应该已经不陌生了。sockfd 就是在调用 socket()之后返回的socket文件描述符,为 int型,所以在用的时候,我们需要定义一个 int sockfd来接受。大家后面看服务器客户端的时候,也能明白前面的 int sockfd是什么意思了。就是为了接受socket()函数调用成功后返回的sockfd描述符。


第二个参数 const struct sockaddr *addr

这个函数比较复杂,这是一个传入参数。里面更是一层套一层。

下面是书中的(以后用的都是 struct sockaddr_in)至于为什么,这就牵扯到历史原因了,大家记住就好。

20191029223924975.png

如果有小伙伴想要知道到底是什么历史原因博主也就在这里给大家分享一下:

如果有小伙伴想要知道到底是什么历史原因博主也就在这里给大家分享一下:


strcut sockaddr 很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。


后续如 sockadd_in对以前的结构体的14字节进行了详细划分,但是却改变了结构体的名字,如果直接将这样的参数传给linux,linux是不认的,所以我们就需要改变他的类型。

目前涉及到要墙砖参数的三个函数:
acceot();
bind();
conect();


20210418225257529.png

值域地址族啊什么的如果要说就有时一大段了,所以博主打算下面的博客再详细介绍。现在博主就先给大家介绍一下bind()函数如何使用,以及参数的大致含义即可。

第二个参数里面包含了 IP和端口号,以及你在使用socket()里面的第一个参数

int domain(协议)

也就意味着你的结构体里面的有一个参数和socket()里面的第一个参数是一致的。

那个参数就是


sa_family_t  sin_family;


剩下的两个参数就是 sin_port----->端口号 最后一个就是IP地址了。也就是它导致了结构体内部嵌套了一个结构体。具体原因就是网络中使用的是网络字节序,而我们常用的是点分十进制的IP表示,也就是下面的这种

20191029230244138.png

而图片上也说明了,那里面的唯一参数就是存放 32位IPV4的地址的。

最后一个参数 socklen_t addrlen

就是为了描述第二个参数的大小而设计的 socklen其实就是利用typedef 的int型

大家在使用bind()函数之前 一般要的步骤是:


1.清空网路地址

2.把IP和端口号以及对应的协议绑定到结构体里面,然后再把结构体传入到bind()的第二个参数里面。

也就是一下代码

struct sockaddr_in servaddr;  //为了让bind()绑定IP和端口号而定义的
bzero(&serv_addr, sizeof(serv_addr)); //将网络地址清空
memset(&serv_addr,0,sizeof(serv_addr));//z这个方法也可以
servaddr.sin_family = AF_INET;//与socket()的第一个参数 int domain一样的协议
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定IP
servaddr.sin_port = htons(6666);  //绑定端口号
bind(serv_addr, (struct sockaddr*)&serv_addr, sizeof(serv_addr));


好了就跟新这么多吧,一般也就是这么写的了,最多在家判断条件而已,宿舍断电了,最后的都是博主抹黑打出来的,真的不容易啊、

后面的 htons这些 INADDR_ANY后续会讲到的。


目录
相关文章
|
网络协议 Unix Linux
计算机网络 套接字函数 | socket、bind、listen、accept、connect
计算机网络 套接字函数 | socket、bind、listen、accept、connect
137 0
|
8月前
网络编程之 字节序和深入理解bind()函数
在上一篇博客里,大家也许会对htons()感到疑惑吧,其实就是字节序的转换,所以这篇博客我们就来详细的解释一下什么是字节序。
112 0
|
Android开发
Android AdbCommandRejectedException和cannot bind to套接字地址(协议/网络地址/端口)只允许使用一次
转载请标明出处: http://blog.csdn.net/DJY1992/article/details/72628622 本文出自:【奥特曼超人的博客】 安装apk时,出现错误: com.
1615 0
|
30天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
67 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
58 10
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
64 10
|
1月前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
1月前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。