基本TCP客户端/服务器程序的套接字函数

1、bind函数把一个本地协议地址赋予一个套接字。对于网际协议,协议地址是32位的IPv4地址或是128位的IPv6地址与16位的TCP或UDP端口号的组合。

#include<sys/socket.h>

int bind(int sockfd,  const struct sockaddr, socklen_t addrlen);

第二个参数是一个指向特定协议的地址结构的指针,第三个参数是该地址结构的长度。对于TCP,调用bind函数可以指定一个端口号,或指定一个IP地址,也可以两者都指定,还可以都不指定。

  • 服务器在启动时捆绑它众所周知的端口。如果一个TCP客户或服务器未曾调用bind绑定一个端口,当调用connect或listen时,内核就要为相应套接字选一个临时端口。让内核来选择临时端口对于TCP客户来说是正常的,除非应用需要一个预留端口。然而对于TCP服务器来说却极为罕见,因为服务器是通过它们的众所周知端口被大家认识的。
  • 进程可以把一个特定的IP地址捆绑到它的套接字上,不过这个IP地址必须属于其所在的网络接口之一。对于TCP客户,这就为在该套接字上发送的IP数据报指定了源IP地址;对于服务器,则限定了该套接字只能接收那些目的地为这个IP地址的客户连接。TCP客户端通常不把IP地址捆绑到它的套接字上。当连接套接字时,内核将根据所用的外出网络接口来选择源IP地址,而所用外出接口则取决于到达服务器所需的路径。如果TCP服务器没有吧IP地址绑定到它的套接字上,内核就把客户发送的SYN的目的IP地址作为服务器的源IP地址。

下图4-6汇总了如何根据预期的结果,设置sin_addr和sin_port或者sin6_addr和sin6_port的值

如果指定端口号为0,那么内核就在bind被调用时选择一个临时端口。然而如果指定IP地址为通配地址,那么内核将在套接字已连接或已在套接字上发出数据报时才选择一个本地IP地址。

对于IPv4来说,通配地址通常由INADDR_ANY来指定,其值一般为0。它告知内核去选择IP地址。

struct sockaddr_in servaddr;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

如此赋值对IPv4是可行的,因为其IP地址是一个32位的值,可以用一个简单的数字常值表示,对于IPv6,我们就不能这么做了,因为128位的IPv6地址是存放在一个结构中的。

struct sockaddr_in6 serv;

serv.sin6_addr = in6addr_any;

系统预先分配in6addr_any 变量并将其初始化为常值IN6ADDR_ANY_INIT。头文件<netinet/in.h>中含有in6addr_any的extern声明。

无论是网络字节序还是主机字节序,INADDR_ANY的值(为0)都一样,因此使用htonl并非必需。不过既然头文件<netinet/in.h>中定义的所有INADDR_常值都是按照主机字节序定义的,我们应该对任何这些常值都使用htonl。

如果让内核来为套接字选择一个临时端口号,那么必须注意,函数bind并不返回所选择的值。实际上,由于bind函数的第二个参数有const限定词,它无法返回所选之值。为了得到内核所选择的这个临时端口值,必须调用函数getsockname来返回协议地址。

进程捆绑非通配符的IP地址到套接字上的常见例子是在为多个组织提供Web服务器的主机上。首先,每个组织都得有各自的域名,譬如这样的形式:www.baidu.com。其次,每个组织的域名都映射到不同的地址,不过通常在同一个子网上。举例来说,如果子网是198.69.10,那么第一个组织的IP地址可以是198.69.10.128,第二个的IP地址可以是198.69.10.129,等等。然后,把所有这些IP地址都定义成单个网络接口的别名(譬如在4.4BSD系统上就使用ifconfig命令的alias选项来定义),这么一来,IP层将接收所有目的地为任何一个别名地址的外来数据报。最后,为每个组织启动一个HTTP服务器的副本,每个副本仅仅捆绑相应组织的IP地址。

从bind函数返回的一个常见错误是EADDRINUSE(“Address already in use”地址已使用)。

网络编程之bind函数相关推荐

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

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

  2. bind函数怎么用JAVA_socket编程之bind()函数

    名称 bind() 把名字和套接字相关联 使用格式 #include #include int bind(int sockfd, const struct sockaddr *addr,socklen ...

  3. 函数式编程之-bind函数

    Bind函数 Bind函数在函数式编程中是如此重要,以至于函数式编程语言会为bind函数设计语法糖.另一个角度Bind函数非常难以理解,几乎很少有人能通过简单的描述说明白bind函数的由来及原理. 这 ...

  4. linux网络编程之Listen函数参数介绍

    1.listen()函数介绍 listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器, ...

  5. linux网络编程之setsockopt()函数来设置socket状态以及getsockopt函数只用总结

    1.setsockopt函数 头文件:#include <sys/types.h> #include <sys/socket.h>定义函数:int setsockopt(int ...

  6. 网络编程之 listen()函数的使用与三次握手的理解

    listen()函数 在进入我们的函数讲解前大家再回顾一下编写服务器端的流程 服务器端:socket()-->bind( )-->listen()-->accept()-->r ...

  7. 网络编程之listen函数

    基本TCP客户端/服务器程序的套接字函数 listen函数仅由TCP服务调用,它做两件事 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect连接的 ...

  8. linux ioctl网络参数设置,Linux 网络编程之ioctl函数

    1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...

  9. unix网络编程之socket函数

    目录 作用 内容 参数 int family int type int protocol 返回值 int 说明 作用 为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,指定需要的 ...

最新文章

  1. python数据分析视频网盘-微专业Python数据分析实战
  2. 品优购dubbox文档bug连环计,还是自己敲最实在!!!!!!
  3. spark sql 1.2.0 测试
  4. 双稳态继电器工作原理图_三招带你分清继电器与接触器
  5. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
  6. Spring 框架 DAO 与 事务 的总结
  7. ubuntu安装python_常用linux指令 ubuntu环境pytorch配置
  8. 利用HttpWebRequest和HttpWebResponse做黑客注射工具
  9. 马化腾、马云并列成为中国首富;百度回应“将上线电商直播”;.NET 5 Preview 2 发布 | 极客头条...
  10. position的absolute;fixed;relative;static;inherit属性小结
  11. 数字图像处理技术与人脸识别
  12. Matlab有趣代码
  13. spring cloud bus
  14. vivo手机如何隐藏应用 vivo手机隐藏应用方法
  15. eve单机版mysql_eve单机版中文下载_eve单机版下载-游迅网
  16. 用纯Python就能写一个漂亮的网页
  17. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs
  18. 用chatgpt做ppt
  19. 怎么看cf的服务器在哪个文件夹,cf录像在哪个文件夹
  20. 在中山大学会出现的电脑问题解决方案

热门文章

  1. 将(123)数字转换成大写数字(壹,贰,弎)
  2. 铁甲雄心机器人冠军_《铁甲雄心》第二季首播 优必选科技引领中国AI机器人进击之路...
  3. Java每次从list中拿取一百条数据
  4. Java波斯王子时之沙攻略_《波斯王子:时之砂》剧情攻略
  5. C语言小游戏-----字母塔
  6. nms,soft nms算法理解
  7. 零基础 6 个月学会英语 - 6 个月从 0 学会英语 - Chris Lonsdale - 学习视频
  8. Solr--Solr 使用SolrJ 完成添加,删除,查询
  9. 漫画|假如一个程序员有“社交牛逼症”
  10. 目前学UI设计好就业吗?做UI设计还会有发展潜力?