2

c语言socket编程,为什么要在服务器程序中指定socket地址?我无法理解为什么要在服务器程序中指定套接字地址,因为无论如何我们都在客户端程序中指定了套接字地址,而在服务器程序中需要指定什么。

这是代码:

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]));
4

4 回答 4

3

大多数服务器没有明确指定套接字地址,它们使用INADDR_ANY(作为@ybo 地址)。

然而,服务器可能指定地址的原因是为了控制客户端到达的接口。例如,您可以绑定到地址 127.0.0.1 (localhost) 以确保客户端仅在本地计算机上运行,​​从而降低与远程连接相关的安全风险。您还可以显式绑定到外部端口,以便更好地沙箱远程客户端。

于 2013-04-11T11:24:45.023 回答
1

实际上与其他答案相同,但换句话说:

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

但是一个服务器也可以很容易地拥有多个公共 IP 地址。您的托管服务提供商会将这些提供给您(并且可能会向您收取费用。)

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

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

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

于 2013-04-11T11:30:20.643 回答
1

您不必这样做您可以使用INADDR_ANY真实地址来代替,但是当您的机器上有多个网络接口时,它会很有用。

于 2013-04-11T11:21:57.870 回答
0

您的计算机可能有许多 IP 地址。(甚至127.0.0.1可以将其视为与“真实”IP 不同的 IP。)在服务器套接字上,您可以选择“监听”这些地址中的哪一个。按照上面的例子,我相信绑定一个服务器套接字127.0.0.1意味着你只能在本地连接到那个服务器程序。

于 2013-04-11T11:27:42.583 回答