通过下面的 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()
调用还允许您将套接字绑定到远程地址和端口。
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(使用前将#替换为@)