网络编程之bind函数

网络编程之bind函数基本 TCP 客户端 服务器程序的套接字函数 1 bind 函数把一个本地协议地址赋予一个套接字 对于网际协议 协议地址是 32 位的 IPv4 地址或是 128 位的 IPv6 地址与 16 位的 TCP 或 UDP 端口号的组合 include lt sys socket h gt intbind intsockfd nbsp conststructs socklen taddrlen 第二个参数是一个指

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

网络编程之bind函数

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

#include

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的值

网络编程之bind函数

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

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

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

       系统预先分配in6addr_any 变量并将其初始化为常值IN6ADDR_ANY_INIT。头文件

中含有in6addr_any的extern声明。



       无论是网络字节序还是主机字节序,INADDR_ANY的值(为0)都一样,因此使用htonl并非必需。不过既然头文件

中定义的所有INADDR_常值都是按照主机字节序定义的,我们应该对任何这些常值都使用htonl。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208280.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:57
下一篇 2026年3月19日 上午11:57


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号