繁体   English   中英

为什么我们在C中的套接字编程中需要服务器的ip地址

[英]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地址。

它将绑定到您的机器/设备中的所有可用接口。 从这里解释:

IP地址INADDR_ANY

在项目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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM