可以bind()套接字到远程地址吗?

2023-12-06

通过下面的 C 代码快照,我明白了,地址bind()调用绑定到listfd,是运行该服务器程序的本地计算机的逻辑地址。随后,服务器监听listfd同一台机器的插座。

struct sockaddr_in serv_addr; 
listfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
serv_addr.sin_port = htons(8000);
retval = bind(listfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listfd)

我学于coursera--- 那,bind()调用还允许您将套接字绑定到远程地址和端口。

enter image description here I would like to understand this point.

我是说,listfd = socket(AF_INET, SOCK_STREAM, 0);提供来自该程序运行的程序进程(本地计算机)的文件描述符。

我的问题:

如果bind()调用绑定了这个本地套接字listfd到远程地址而不是INADDR_ANY,那么哪台机器实际上在监听?因为listfd是运行该程序的本地计算机和该套接字的本地进程文件描述符表中的条目listfd正在绑定到远程机器IP地址吗?我该如何解释?这在幕后是如何工作的?


你不能bind()到远程地址,至少不在AF_INET家庭。根据绑定的手册页,你会得到一个EADDRNOTAVAIL错误,表明您要绑定的地址不是本地的。

Edit: bind() may适用于远程地址,但它肯定不适用于AF_INET家庭。请注意,还有更多内容。可能有一些系列确实支持绑定到远程地址,可能是一些集群协议。即使没有,bind()可能适用于那些理论上万一出现一些协议,这完全有意义。

编辑2:作为thuovila指出,实际上存在一种情况,即绑定远程地址AF_INET作品。也就是说,设置IP_TRANSPARENT绑定之前的套接字选项。ip(7) 的手册页告诉我们:

   IP_TRANSPARENT (since Linux 2.6.24)
          Setting this boolean option enables transparent proxying on
          this socket.  This socket option allows the calling
          application to bind to a nonlocal IP address and operate both
          as a client and a server with the foreign address as the local
          endpoint.  NOTE: this requires that routing be set up in a way
          that packets going to the foreign address are routed through
          the TProxy box (i.e., the system hosting the application that
          employs the IP_TRANSPARENT socket option).  Enabling this
          socket option requires superuser privileges (the CAP_NET_ADMIN
          capability).

          TProxy redirection with the iptables TPROXY target also
          requires that this option be set on the redirected socket.

因此,通过大量额外的工作,您可以构建一个透明代理通过将本地和远程套接字与该套接字选项集绑定在一起(如果我理解正确的话)。

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

可以bind()套接字到远程地址吗? 的相关文章

随机推荐

  • 动态添加验证规则

    我有一个插件 它通常处理用于 CRUD 操作的 jQuery 对话框的创建 添加到对话框的表单标记可在插件代码外部使用 并且插件只需请求 http 服务提供标记 并且在收到标记时只需将其添加到对话框本身 然后我在插件中创建了一个回调 onS
  • Java 虚拟机的字节顺序

    Java 在其虚拟机中使用什么字节序 我记得在某处读到它取决于它运行的物理机器 然后我在其他地方读到它总是 我相信 大端 哪个是对的 多字节数据在class文件以大端存储 From Java 虚拟机规范 Java SE 7 版 第 4 章
  • 是否可以将一个 XOR 约束链接到 UML 中的另一个 XOR 约束?

    这是我想做的一个例子 假设我有 5 个类 我想表达这样的约束 我们可以有一个类 B 或 和 C 的实例链接到 A 如果是这样 我们就不能有其他任何东西 如果我们不这样做没有这些类的任何实例 我们只能有 D 或 E 类的一个实例 我在这里查看
  • 阻止 MFC 应用程序将光标更改回默认图标

    我编写了一个应用程序 它根据光标在窗口客户区域内的位置来更改光标 但是我注意到 当我单击鼠标左键时 光标会变回默认箭头图标 我已经覆盖了afx msg void CWnd OnLButtonDown 并且不要调用其中的任何基类函数 它完全是
  • 有什么方法可以增加 MATLAB 中的“realmax”吗?

    我的机器上的 realmax 是 1 7977e 308 我知道我必须以一种避免长整数计算的方式编写代码 但是有什么方法可以增加限制吗 我的意思是像 C 中的 gmp 库之类的东西 你可能会发现vpa 变精度算术 有帮助 R vpa A 使
  • 如何做出类似tokiolab.it的视差效果? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我读了很多关于 jQuery 视差的文章 但我根本不明白 我想做和这个网站一样的事情 http www tokiolab it 正如您所看到的 第一页是一个非常简单的动画 但是当
  • 从命令行使用参数(连接字符串、用户、密码...)打开 SQL Developer

    是否可以使用参数 例如 Connectstring SID 主机 用户 密码 从命令行打开 Oracle SQL Developer 4 我想从 KeePass 运行它 并且我想移交这些参数来访问数据库 Thanks 不 这对于 SQL D
  • Android Socket Client 未发送并自行关闭

    我对 android 和 java 编程很陌生 我需要你的帮助 我想在我的 PC Windows 7 上创建 Android 客户端和服务器 我用putty 一个模仿客户端的程序 没有编程错误 检查了我的服务器编程是否没有错误 因此我认识到
  • Net::HTTP 在 Ruby 中获取超时

    如何在 net http 中设置更大的超时 我正在做的是这样的 rta JSON parse Net HTTP get URI url 我试过了 uri URI url http Net HTTP new uri host uri port
  • Swift - 通过 alamofire 上传图像时,HTTP 加载失败(错误代码:-1005 [4:-4])。

    我是 iOS 新手 使用 Alamofire 上传图像 我写的代码如下 let image imageView image let imgData UIImageJPEGRepresentation image 0 2 let header
  • 自定义数组类:列表初始化的构造函数

    我正在 C 中开发一个自定义数组类 作为自我引导的练习 并且我不确定如何创建一个构造函数来允许我执行以下操作 include array h include
  • 在 Javascript 中将多个变量分配给同一个值?

    我在 JavaScript 文件中初始化了全局范围内的几个变量 var moveUp moveDown moveLeft moveRight var mouseDown touchDown 我需要将所有这些变量设置为 false 这是我目前
  • 将 JavaScript 数组转换为字符串

    我正在尝试迭代 值 列表并将其转换为字符串 这是代码 var blkstr each value function idx2 val2 var str idx2 val2 alert str return str get join Aler
  • axios请求错误SSL连接错误React JS

    我在 React JS 中有这个发布请求 我需要使用 Rest API 传递文件并接收对 React 的响应 但当我这样做时 我收到错误 用 python 编写的 Rest Api 我对文件做了一些处理 let postR results
  • 使用 PHP POST 到 Web 服务的摘要式身份验证的客户端部分

    我正在尝试 POST 到 Web 服务 非 RESTful 并通过 PHP 获取响应 但是 该 Web 服务需要摘要式身份验证 我一直在网上搜索 发现大多数讨论和文章都是关于相反的方式 向用户请求摘要式身份验证 而不是使用 PHP 进行响应
  • 从 DataTable 填充 MVC Webgrid

    我正在尝试使用 DataTable 填充 MVC Webgrid 该 DataTable 在后面的代码中构建 然后使用 AsEnumerable 扩展方法进行枚举 但是 当我调用 GetHtml 方法时 输出不是我所期望的 它由两列 Has
  • C# 如何创建一组集合

    我想创建一组 int 的 集合 就像是 SortedSet
  • 使用 SqlBulkCopy 是否有比使用 DataTable 更快的方法?

    我将大量记录加载到我的应用程序中 超过 100 万条 并对它们进行大量处理 处理需要它们全部位于内存中 之后 我想将所有 现已修改的 记录转储到一个空表中 加载记录只需要几秒钟 我最终会得到一大堆MyRecord items 保存使用Sql
  • Android 在 WebView 中显示 .Doc 文件?

    在我的应用程序中 我有链接http mymobilece com api api getexammaterials php id 28 我想在 webview 中查看 我尝试使用谷歌文档查看器它工作正常但我需要它而不需要谷歌文档查看器 如何
  • 可以bind()套接字到远程地址吗?

    通过下面的 C 代码快照 我明白了 地址bind 调用绑定到listfd 是运行该服务器程序的本地计算机的逻辑地址 随后 服务器监听listfd同一台机器的插座 struct sockaddr in serv addr listfd soc