![](/img/trans.png)
[英]In socket programming in c,why to specify the socket address in server program?
[英]Why do we require the ip address of server in itself in socket programming in C
我是套接字编程的新手。 在编写一个简单的客户端 - 服务器应用程序时,我发现我们将服务器绑定到服务器地址结构。
// define the server address
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr = INADDR_ANY; //focus on this line --- line 4
// bind the socket to our specified IP and port
bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
如代码所示,为什么我们需要第4行? 我们知道服务器套接字将绑定在服务器machine-ip(本身)上,它无法绑定到任何其他ip。 在这种情况下, INADDR_ANY
(或任何其他ip?)的意义是什么?
现在想象一下服务器。 而且,服务器有3个网卡。 1专用于生产(专用于应用程序),另一个用于备份(因此在备份期间PROD NIC网络不会被卡住)和第三个用于维护(无法访问外部世界且仅在内部使用的一个) ,供管理员访问机器)。
你在里面运行了一个ssh守护进程。 现在服务器不能通过外部世界的ssh访问(即从PROD NIC),因此您无法将ssh绑定到NIC1 IP,也无法将其绑定到0.0.0.0。 NIC3专用于管理目的,您将ssh守护程序绑定到其IP。
有道理,不是吗?
这同样适用于备份和主应用程序。 通常主应用程序不能从LAN访问,因此它必须绑定到NIC1 IP。 并且备份调度程序侦听器不可能由来自外部的连接触发,因此您将它绑定到NIC的IP,无论哪个连接到bkups服务器(NIC2)。
通常本地数据库仅限于环回,因此无法通过任何NIC访问它们。 一般服务通常可以通过服务器上安装的任何NICS获得(想想httpd,DNS @LAN等)。
这就是你必须绑定的原因 - 你必须选择如何访问套接字:通过环回,通过任何一个NIC或通过任何NIC / LO。
主机可以安装多个网络接口 (即,一次连接到多个网络),并且至少有一个与每个接口相关联的IP地址(例如,考虑IP别名 )。
INADDR_ANY
将套接字绑定到所有可用接口。 否则,您必须指定要绑定的特定接口的IP地址。
它将绑定到您的机器/设备中的所有可用接口。 从这里解释:
在项目1中编写简单FTP服务器时,可能会将侦听套接字绑定到特殊IP地址INADDR_ANY。 这使您的程序可以在不知道运行它的机器的IP地址的情况下工作,或者在具有多个网络接口的机器的情况下,它允许您的服务器接收发往任何接口的数据包。 实际上,INADDR_ANY的语义更复杂且更复杂。
在模拟器中,INADDR_ANY具有以下语义:接收时,绑定到此地址的套接字接收来自所有接口的数据包。 例如,假设主机具有接口0,1和2.如果此主机上的UDP套接字使用INADDR_ANY和udp端口8000绑定,则套接字将接收到达接口0,1或者端口8000的所有数据包,或者2.如果第二个套接字尝试绑定到接口1上的端口8000,则绑定将失败,因为第一个套接字已经“拥有”该端口/接口。
发送时,与INADDR_ANY绑定的套接字绑定到默认IP地址,即接口编号最小的IP地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.