在C语言的套接字编程中,为什么需要在服务器程序中指定套接字地址?

3
在C语言的套接字编程中,为什么需要在服务器程序中指定套接字地址? 我无法理解为什么需要在服务器程序中指定套接字地址,因为我们无论如何都会在客户端程序中指定套接字地址,那么在服务器程序中指定的必要性是什么呢?
以下是代码:
bzero((char *)&serv_addr,sizeof(serv_addr));

serv_addr.sin_family=AF_INET;

serv_addr.sin_addr.s_addr=inet_addr(argv[1]);

serv_addr.sin_port=htons(atoi(argv[2]));

Posix(或BSD套接字)中有更多的套接字编程,而不是C;我建议阅读一本好的关于Posix网络编程的书籍。如果在Linux上,请阅读http://advancedlinuxprogramming.com/。 - Basile Starynkevitch
4个回答

3

大多数服务器不会显式指定套接字地址,它们使用INADDR_ANY(如@ybo所述)。

然而,服务器可能会指定地址的原因是控制客户端到达的接口。例如,您可以绑定到地址127.0.0.1(本地主机),以确保客户端仅在本地机器上运行,从而减少与远程连接相关的安全风险。您也可以显式地绑定到外部端口,以更好地隔离远程客户端。


1

您不必使用真实地址,可以使用INADDR_ANY,但如果您的计算机上有多个网络接口,则可以派上用场。


1

实际上与其他答案相同,只是用不同的话来表达:

服务器通常只使用一个公共IP地址。并且还有1个或多个内部IP地址(例如localhost 127.0.0.1和可能为lan 192.168.0.1)。

但是服务器也可以轻松拥有多个公共IP地址。您的托管提供商将为您提供这些IP地址(并且可能会向您收费)。

如果服务器将在端口443上托管多个HTTPS证书,则甚至需要多个公共IP地址,因为每个证书都绑定到特定的IP地址。

在侦听时,您可以仅侦听1个特定的IP地址,从而忽略其他IP地址的流量。您甚至可以让其他应用程序在其他IP地址上使用相同的端口号。

如果出于安全原因,您只希望应用程序从localhost连接(例如客户端和服务器位于同一台机器上),则最好仅在127.0.0.1上侦听,而不是所有IP地址。


0
你的计算机可能有很多IP地址。(甚至可以认为127.0.0.1是与你的“真实”IP地址不同的一个独立IP地址。)在服务器套接字上,你可以选择监听哪些地址。根据以上示例,我相信将服务器套接字绑定到127.0.0.1意味着你只能在本地连接到该服务器程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接