初识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)至于为什么,这就牵扯到历史原因了,大家记住就好。

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

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

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

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

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

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

int domain(协议)

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

sa_family_t  sin_family;

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

而图片上也说明了,那里面的唯一参数就是存放 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后续会讲到的。

网络编程之bind()的未解之谜相关推荐

  1. 网络编程之bind函数

    基本TCP客户端/服务器程序的套接字函数 1.bind函数把一个本地协议地址赋予一个套接字.对于网际协议,协议地址是32位的IPv4地址或是128位的IPv6地址与16位的TCP或UDP端口号的组合. ...

  2. socket网络编程之htons()相关详解

    1.走起 ntohs =net to host short int 16位 htons=host to net short int 16位 ntohl=net to host long int 32位 ...

  3. Android 网络编程之HTTPS详解

    前言:HTTPS涉及相关的知识,总是很难的将其归纳总结起来,本文旨在带你学习详细的HTTPS相关知识点,看完本文后,你会了解到以下相关知识点: HTTPS的工作原理 HTTPS为什么要这样设计 密码学 ...

  4. 网络套接字编程之IO模型详解

    网络套接字编程之IO模型详解 本文主要参考自<UNIX网络编程>(第1卷)(套接口API第3版) Unix下可用的五种I/O模型有: 阻塞式I/O 非阻塞式I/O I/O复用(select ...

  5. Python中的网络编程之TCP

    Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...

  6. Centos网络编程之tcp十一种状态及问题处理办法

    尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...

  7. Python中的网络编程之UDP

    Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...

  8. 网络编程之socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  9. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

最新文章

  1. 转: Meshlab简介
  2. SharePoint 搜索功能失效
  3. python时域信号特征提取(各种因子)
  4. Css学习总结(3)——CSS布局解决方案 - 水平、垂直居中、多列布局、全屏布局
  5. html 文字过多如何显示,当页面文字过多时,怎么用css使超出部分显示省略号?(单/多行代码演示)...
  6. 轻量化网络:ShuffleNet V2
  7. 2015 Objective-C 新特性
  8. origin游戏服务器引擎
  9. idea配置阿里格式化模板+注释模板
  10. Facebook登陆时遇到的问题
  11. grok logstash配置_logstash grok匹配
  12. 计算机全键在线使用说明书,最全的电脑键盘所有键的功能说明,建议收藏!
  13. Flume编写拦截器
  14. 【JQuery】使用JQuery实现城市两级或三级联动(下拉菜单)
  15. linux操作系统 第02章 linux操作做基础
  16. 1-17 Set集合和Map集合
  17. el-radio-group change事件获取老值
  18. 汽车电子技术 PPT
  19. 无人机介绍以及测评推荐
  20. 康得新暴跌70%,背后隐藏着怎样的真相?

热门文章

  1. 关于计算机博弈的开源项目
  2. 2021年中国再生纱市场趋势报告、技术动态创新及2027年市场预测
  3. 做游戏,学编程(C语言) 10 僵尸危机
  4. 智能DBA呼声高、仅20%开发者懂操作系统、芯片人才匮乏,揭晓中国基础软件开发者现状
  5. 程序员大危机,工作难逃监视系统“法眼”
  6. C与C++关于*与的传参解析
  7. 火山引擎正式发布大数据研发治理套件
  8. 多个线程“打架抢夺”同一个资源,该如何让它们安分?
  9. 杨澜对话华为周跃峰:发展数字经济,存储技术是关键
  10. TIOBE 1 月编程语言排行榜:C 语言再度「C 位」出道!