2.深入了解bind函数

2023-11-03

1.查看方法

使用指令:man bind

bind

bind

2.详细解说(中文)

bind函数:

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

2.函数原型:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

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

3.参数说明:

1.sockfd: socket文件描述符
2.*addr: 一个指向特定协议的地址结构的指针
3.addrlen: *addr的长度

4.函数返回值:

成功:  0
失败:-1

5.bind()使用:针对TCP/IP

1.调用bind()时,可以指定一个端口号
2.调用bind()时,可以指定一个IP地址
3.调用bind()时,可以指定端口号和IP地址
4.调用bind()时,可以都不指定

下表汇总了如何根据预期的结果,选择设置sin_addrsin_port或者sin6_addrsin6_port

IP地址 端口 结果
通配地址 0 内核选择IP地址和端口
通配地址 非0 内核选择IP地址,进程指定端口
本地IP地址 0 进程指定IP地址,内核指定端口
本地IP地址 非0 进程指定IP地址和端口

对于IPv4: 通配地址由常值INADDR_ANY来指定,其值一般为0,它告知内核去选择IP地址。如下复制语句:

struct sockaddr_in servaddr;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  /*wildcard*/

如此复制语句对IPv4是可行的,因为其IP地址是32位的值,可以用一个简单的数字常值表示;对于IPv6,我们就不能这样做,因为128位的IPv6地址是存放在一个结构中,在C语言总赋值语句的右边不能是常值结构,所以我们改写为:

struct sockaddr_in6 serv;
serv.sin6_addr = in6addr_any;  /*wildcard*/

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

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

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

进程捆绑非通配IP地址到套接字上的常见例子是在为多个组织提供Web服务器的主机上。首先,每个组织都得有各自的域名,譬如这样的形式: www.organization.com.其次,每个组织的域名都映射到不同的IP地址,不过通常仍在同一个子网上。

举例来说:
如果子网是198.69.10
那么第一个组织的IP地址可以是198.69.10.128;
第二个组织的可以198.69.10.129等等。

然后,把所有这些IP地址都定义成单个网络接口的别名( 譬如在4.4BSD系统上就使用ifconfig命令的alias选项来定义),这么一来,IP层将接收所有目的地为任何一个别名地址的外来数据报。最后,为每个组织启动一个HTTP服务器的副本,每个副本仅仅捆绑相应组织的IP地址。

3.bind文档

BIND(2)                                                             Linux Programmer's Manual                                                            BIND(2)

NAME
       bind - bind a name to a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

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

DESCRIPTION  描述
       When a socket is created with socket(2), it exists in a name space (address family) but has no address assigned to it.  bind() assigns the address speci‐
       fied by addr to the socket referred to by the file descriptor sockfd.  addrlen specifies the size, in bytes, of the address structure pointed to by addr.
       Traditionally, this operation is called “assigning a name to a socket”.
       
       当使用socket(2)创建套接字时,它存在于一个名称空间(地址族)中,但没有分配给它地址。Bind()将由addr指定的地址分配给由文件描述符sockfd引用的套接字。Addrlen以字节为单
       位指定addr所指向的地址结构的大小。
	传统上,这个操作被称为“给套接字赋一个名称”。

       It is normally necessary to assign a local address using bind() before a SOCK_STREAM socket may receive connections (see accept(2)).
	在SOCK_STREAM套接字接收连接之前,通常需要使用bind()分配一个本地地址(accept(2))。
	
       The rules used in name binding vary between address families.  Consult the manual entries in Section 7 for detailed information.  For AF_INET, see ip(7);
       for AF_INET6, see ipv6(7); for AF_UNIX, see unix(7); for AF_APPLETALK, see ddp(7); for  AF_PACKET,  see  packet(7);  for  AF_X25,  see  x25(7);  and  for
       AF_NETLINK, see netlink(7).
       名称绑定中使用的规则因地址族而异。详细信息请参阅第7节中的手册条目。AF_INET,见ip(7); AF_INET6,见ipv6(7);对于AF_UNIX,参见unix(7);AF_APPLETALK,
       见ddp(7);AF_PACKET,见packet(7);对于AF_X25,见x25(7);AF_NETLINK参见netlink(7)。

       The actual structure passed for the addr argument will depend on the address family.  The sockaddr structure is defined as something like:
	为addr参数传递的实际结构将取决于地址族。sockaddr结构的定义如下:
           struct sockaddr {
               sa_family_t sa_family;
               char        sa_data[14];
           }

       The only purpose of this structure is to cast the structure pointer passed in addr in order to avoid compiler warnings.  See EXAMPLE below.
	这个结构的唯一目的是对addr中传递的结构指针进行强制转换,以避免编译器警告。请参见下面的例子。
	
RETURN VALUE 返回值
       On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.
	如果成功,则返回0。在出错时,返回-1,并适当地设置errno。

ERRORS
       EACCES The address is protected, and the user is not the superuser.
       EACCES 地址受保护,用户不是超级用户。

       EADDRINUSE
              The given address is already in use.
              给定地址已被使用。
EADDRINUSE
              (Internet  domain  sockets)  The  port  number was specified as zero in the socket address structure, but, upon attempting to bind to an ephemeral
              port, it was determined that all port numbers in the ephemeral port range are currently in use.  See the discussion  of  /proc/sys/net/ipv4/ip_lo‐
              cal_port_range ip(7).
              在套接字地址结构中,端口号被指定为0,但是,当尝试绑定一个临时端口时,它被确定在临时端口范围内的所有端口号目前都被使用。
cal_port_range ip(7)。

       EBADF  sockfd is not a valid file descriptor.Sockfd不是一个有效的文件描述符。

       EINVAL The socket is already bound to an address.

       EINVAL addrlen is wrong, or addr is not a valid address for this socket's domain.

       ENOTSOCK
              The file descriptor sockfd does not refer to a socket.

       The following errors are specific to UNIX domain (AF_UNIX) sockets:

       EACCES Search permission is denied on a component of the path prefix.  (See also path_resolution(7).)

       EADDRNOTAVAIL
              A nonexistent interface was requested or the requested address was not local.

       EFAULT addr points outside the user's accessible address space.

       ELOOP  Too many symbolic links were encountered in resolving addr.

       ENAMETOOLONG
              addr is too long.

       ENOENT A component in the directory prefix of the socket pathname does not exist.

       ENOMEM Insufficient kernel memory was available.

       ENOTDIR
              A component of the path prefix is not a directory.

       EROFS  The socket inode would reside on a read-only filesystem.

CONFORMING TO
       POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (bind() first appeared in 4.2BSD).

NOTES
       POSIX.1  does  not require the inclusion of <sys/types.h>, and this header file is not required on Linux.  However, some historical (BSD) implementations
       required this header file, and portable applications are probably wise to include it.

       For background on the socklen_t type, see accept(2).

BUGS
       The transparent proxy options are not described.

EXAMPLE
       An example of the use of bind() with Internet domain sockets can be found in getaddrinfo(3).

       The following example shows how to bind a stream socket in the UNIX (AF_UNIX) domain, and accept connections:

       #include <sys/socket.h>
       #include <sys/un.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <string.h>

       #define MY_SOCK_PATH "/somepath"
       #define LISTEN_BACKLOG 50

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char *argv[])
       {
           int sfd, cfd;
           struct sockaddr_un my_addr, peer_addr;
           socklen_t peer_addr_size;

           sfd = socket(AF_UNIX, SOCK_STREAM, 0);
           if (sfd == -1)
               handle_error("socket");

           memset(&my_addr, 0, sizeof(struct sockaddr_un));
                               /* Clear structure */
           my_addr.sun_family = AF_UNIX;
           strncpy(my_addr.sun_path, MY_SOCK_PATH,
                   sizeof(my_addr.sun_path) - 1);
           if (bind(sfd, (struct sockaddr *) &my_addr,
                   sizeof(struct sockaddr_un)) == -1)
               handle_error("bind");

           if (listen(sfd, LISTEN_BACKLOG) == -1)
               handle_error("listen");

           /* Now we can accept incoming connections one
              at a time using accept(2) */

           peer_addr_size = sizeof(struct sockaddr_un);
           cfd = accept(sfd, (struct sockaddr *) &peer_addr,
                        &peer_addr_size);
           if (cfd == -1)
               handle_error("accept");

           /* Code to deal with incoming connection(s)... */

           /* When no longer required, the socket pathname, MY_SOCK_PATH
              should be deleted using unlink(2) or remove(3) */
       }

SEE ALSO
       accept(2), connect(2), getsockname(2), listen(2), socket(2), getaddrinfo(3), getifaddrs(3), ip(7), ipv6(7), path_resolution(7), socket(7), unix(7)

COLOPHON
       This page is part of release 5.05 of the Linux man-pages project.  A description of the project, information about reporting bugs, and the latest version
       of this page, can be found at https://www.kernel.org/doc/man-pages/.

Linux                                                                      2019-03-06

参考文档
[1] linux man手册
[2]《Linux高性能服务器》
[3]《Unix网络编程卷1》

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.深入了解bind函数 的相关文章

  • 是否可以将 char * 转换为结构?

    这是我的问题 rcvfrom 参数之一是 char 一旦我从中获取数据 我想将其转换为结构 然而选角并不成功 我究竟做错了什么 这是我所做的 struct int8 t seq int8 t ack bool flag char data
  • 如何在 Docker 上发布 UDP 端口?

    如何将 UDP 端口从 Docker 容器转发到主机 使用 p 标志并添加 udp端口号的后缀 p 53160 53160 udp 完整命令 sudo docker run p 53160 53160 p 53160 53160 udp p
  • 在 Android 上显示实时 UDP 或 RTP 流(组播)

    我刚接触 Android 开发几周 我需要编写一个应用程序 可以向用户显示以 UDP 或 RDP 多播的实时流 该流位于诸如 rtp 230 0 0 11 1234 之类的地址 并通过该模块通过 WIFI 发出 我已经尝试从播放器 Daro
  • 是否可以在 socket.io 中使用 UDP?

    我正在开发一款游戏 听说 UDP 更适合实时游戏 我知道 socket io 使用 TCP 并且想知道是否有某种方法可以将其切换到 UDP 我尝试查找它 但只找到了 2012 年左右的帖子 其中说 UDP 仅在浏览器中处于实验阶段 从标准浏
  • Golang编写的UDP客户端无法接收来自服务器的消息

    我写了一个Java客户端 它向广播地址发送消息 我还编写了一个Java服务器 它接受所有发送的消息并将消息发送回客户端 现在我想尝试在 Go 中做同样的事情 只是为了获得一些经验 服务器工作正常 正在接收消息并对 Java 客户端做出响应
  • 从 iOS 应用程序上的 UDP 服务器接收数据无法在 Linux 服务器上工作,但可以在 macbook pro 上工作 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 背景 我做
  • 播放 UDP 数据包中收到的原始 PCM 音频

    远程设备正在 UDP 数据包中发送实时原始 PCM 音频 不包含标头 我需要在 java 中实现一个程序来接收这些数据包并在 PC 上实时播放它们 据我所知 原始 PCM 的属性是 16 位 单声道 采样率 24KHz 因此我尝试向该原始
  • UDP 数据报中发送的消息未经过净化?

    我的代码如下 一切都按照我想要的方式进行 但是当我的消息收到时 它们的末尾有很多框 有点像这样 消息 你好 如何才能让接收和打印的内容仅为 Message hello 我非常感谢任何帮助 import java io import java
  • UDP 数据包在交付时是否保证是完整的、具有实际意义的?

    众所周知 UDP 用户数据报协议 并不安全 因为用它发送的数据包的顺序可能不按顺序传送 甚至根本不按顺序传送 但是 如果发送了 UDP 数据包 该数据包中的信息在实际意义上 99 99 及以上 是否保证正确 在实际意义上 99 99 及以上
  • Android 无法通过互联网从 PC 服务器接收 UDP 数据

    我目前正在探索用Java 进行UDP 数据包传输 以在Android 上创建多人游戏 我使用通常的 127 0 0 1 成功地在 Nexus 4 内交换数据包 并且还成功地在本地网络中的 PC 服务器和 Android 客户端之间交换数据包
  • Android 上的 UDP 视频流

    我有一个 Android 项目 需要构建一个客户端应用程序来接收 UDP 或 RTP 单播视频流并播放它们 不幸的是 我似乎无法使其正常工作 并且已经广泛搜索了解决方案 我已经在 Xoom Android 3 2 和 Nexus S And
  • 数据报总是被完整接收吗?

    大多数数据报接收函数 例如c的recv或read java的DatagramPacket类或python的SocketServer 都包含找出接收数据量的可能性 c int amount recv sock buf n MSG WAITAL
  • 我应该使用哪个高级 API 来管理 iOS 上的 UDP 套接字? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在章节 使用套接字和流 https developer apple com library mac d
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • 将 Docker 容器连接到网络接口/设备而不是 IP 地址

    经过仔细的研究 测试和摆弄 我只能找到通过从 IP 端口转发来将 Docker 容器连接到给定接口的方法 这可以通过添加来完成 p Host IP Host Port Container Port to a docker run命令 我有一
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是

随机推荐

  • vcruntime140.dll缺失的解决方法分享,快速修复vcruntime140.dll文件

    当你在运行某些应用程序或游戏时遇到vcruntime140 dll缺失的错误提示 可能会导致应用程序无法启动或执行 vcruntime140 dll是与Microsoft Visual C Redistributable相关的一个重要系统文
  • win10安装破解软件提示病毒并且删除安装软件,暂时关闭安全检查

    1 左击屏幕左下角 找到系统设置 2 点击进入 更新和安全 3 点击 windows 安全 再 点击 病毒和威胁防护 4 点击设置 5 关闭 实时检查 6 安装完毕后一定重新开启 否则后果自负
  • PMOS开关电路

    本次项目上需要实现的功能是利用AO3401 PMOS设计一个开关电路 实现一款设备的开关控制 被控设备12V供电 供电电流小于3A即可 且为了提高响应速度 使流过该设备的电流尽可能的大 该设备内阻大约为6ohm AO3401产品参数 VDS
  • HTTP超详细教程

    1 HTTP协议 1 1 HTTP简述 HTTP全称为超文本传输协议 是一种应用比较广泛的应用层协议 那何为超文本 超文本指的是传输的内容不仅仅是文本 比如 html css javaScript 等数据 还可以是一些其他的资源 比如图片
  • AI修复人像

    一 前言 最近闲来无事 翻了翻以前的老照片 看着多年前的老照片 感慨万千 仿佛又回到了以前的青春岁月 只可惜青春易逝 无法重来 意气风发 头角峥嵘的画面只能永远地留存在相片之中了 只叹当时没有多拍几张照片留作纪念 可惜当时设备也不好 照片效
  • 【Linux】低级IO

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 文件的概念 二 C语言文件操作回顾 三 使用系统调用进
  • 山大网安靶场实验平台项目—个人记录(一)

    系列文章专栏地址 山东大学网络安全靶场实验平台 本期内容 完成项目框架设计 学习vue和element ui 了解基本语法 编写前端页面 组件 学习springboot为写后端作准备 项目框架设计 time 3 days 首先我们这个项目是
  • Vue3功能实战 —— 动态路由、路由签权、动态组件 使用示例

    前期回顾 Vue3 TS Vite 大屏可视化 项目实战 vue3可视化大屏 彩色之外的博客 CSDN博客大屏可视化项目实战 vue3可视化大屏https blog csdn net m0 57904695 article details
  • zabbix6.2.4企业微信群机器人告警

    zabbix6 2 4企业微信群机器人告警 基于https blog csdn net stars moon1024 article details 123042369调试 创建媒介 脚本如下 var Wechat token null t
  • linux 怎么样复制文件夹内所有文件到另一个文件夹?

    cp Rf home user1 root temp 将 home user1目录下的所有东西拷到 root temp 下而不拷贝user1目录本身 即格式为 cp Rf 原路径 目的路径
  • 集成底座双K8S集群扩展升级方案

    集成底座方案是应用于企业信息化建设的集成整合阶段 通过建立统一 标准 柔性 可复用 可扩展的IT架构 解决企业信息化建设过程中缺乏整体规划 集成整合难度大 安全管控不到位等问题 强化企业信息化的架构建设 集成整合 数据治理 安全管控的水平
  • 腾讯测开笔试题

    测开笔试题分享 一个数组里面有混序的正负数 按照以下要求重新排列 1 按照正负间隔的顺序排列 2 同一个符号的数相对顺序不变 3 若某一个符号的数较多 按原顺序放在最后 例如输入 1 2 3 7 9 5 3 4 7 8 11 3 2 期望输
  • .Net WinForm 中关于输入法打开却无法输入中文总结

    根据前面的兄弟们解决方法我做了下总结 希望对以后遇到此问题的同行提供点帮助 大家如果还有好的方法也请回复提供我 共同学习 出现这个问题时我的输入法设置为 注意我这里使用简体中文美式键盘 然后我删除了简体中文美式键盘 添加了英语 美国 美式键
  • Git命令语句

    一 关于Git 1 Git介绍 Git是一个开源的分布式版本控制系统 用于敏捷高效的处理任何或大或小的项目 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件 版本控制 版本控制是一种在开发
  • Android ActionBar的基本用法

    本文翻译了这篇文章 Using the Android action bar ActionBar Tutorial 1 ActionBar的简介 ActionBar位于Activity的顶部 可用来显示activity的标题 Icon Ac
  • 一周AI看点

    本期一周AI看点包括 技术前沿 行业 观点 应用以及投融资等方面 技术前沿 CCAI 2017 香港科技大学计算机系主任杨强 论深度学习的迁移模型在7月22 23日举办的CCAI 2017上 香港科技大学计算机与工程系主任 AAAI Fel
  • 案例:使用seaborn分析泰坦尼克号生还者数据

    目录 一 数据来源 数据的导入 二 主要分析的内容 定义问题 泰坦尼克号乘客基本信息分布情况 乘客的信息与生还数据是否有关联 三 数据清洗 3 1 查看是否有缺失值 3 2 查看数据基本信息 3 3 绘制年龄分布图 通过seaborn的di
  • 学习笔记-架构的演进之k8s的存储生态系统-3月day11

    文章目录 前言 块存储 文件存储 对象存储 总结 附 前言 随着 Kubernetes 的 CSI 规范成为容器业界统一的存储接入标准 现在几乎所有的云计算厂商都支持自家的容器通过 CSI 规范去接入外部存储 能够应用于 CSI 与 Fle
  • 获取JSON里面result的值 以及将里面的(List数组或对象)转换出来并读取到

    前言 记录一下今天的问题 首先我是在定时任务了 每次当项目启动时都需要调用别人的接口他来返回我数据 我并获取到他的数据进行同步更新 到我的数据库表里 那么怎么获取到呢 下面废话不多说 这是我打印出 返回给我的数据 为虚构数据 仅参考 suc
  • 2.深入了解bind函数

    bind函数 1 查看方法 2 详细解说 中文 bind函数 3 bind文档 1 查看方法 使用指令 man bind 2 详细解说 中文 bind函数 1 功能 bind函数把一个本地协议地址赋予一个套接字 对于网际网协议 协议地址是3