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

时间:2014-10-22 12:32:55

标签: c sockets bsd

使用以下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 我想了解这一点。

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

我的问题:

如果bind()调用将此本地套接字listfd绑定到远程地址而不是INADDR_ANY,那么哪台机器实际正在侦听?因为listfd是来自运行此程序的本地计算机的本地进程文件描述符表的一个条目,并且此套接字listfd正在绑定到远程计算机IP地址?我该如何解释?这是如何工作的?

2 个答案:

答案 0 :(得分:3)

您不能bind()到远程地址,至少不能在AF_INET家庭中。根据{{​​3}},您会收到EADDRNOTAVAIL错误,说您要绑定的地址不是本地地址。

修改:bind() 可能适用于远程地址,但肯定不适用于AF_INET系列。请注意,还有更多。可能有一些家族确实支持绑定到远程地址,可能是某些群集协议。即使没有,bind()可能会在理论上

Edit2:正如man page of bind指出的那样,实际上存在绑定AF_INET中的远程地址的情况。也就是说,在绑定之前设置IP_TRANSPARENT套接字选项。 thuovila告诉我们:

   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.

因此,通过大量额外工作,您可以通过将本地和远程套接字与该套接字选项集绑定来构建The man page of ip(7)(如果我理解正确的话)。

答案 1 :(得分:1)

我同意Coursera材料可能是错误的,或者至少误导了关于网络编程的介绍级学习。

然而,我无法抑制迂腐的评论。 (在Linux上)可以绑定到非本地IP地址。请在http://man7.org/linux/man-pages/man7/ip.7.html查看选项IP_TRANSPARENT。不过,这可能与手头的问题关系不大。此外,我很欣赏这个问题被标记为bsd。

关于这一点,bind()与听力没有任何关系。它只是将fd与地址相关联。 listen()调用启用“监听”。可以bind()用于传出连接的套接字。