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

在c语言的套接字编程中,为什么要在服务器程序中指定套接字地址?,c,sockets,C,Sockets,在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=

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

您不必这样做,您可以使用
INADDR\u ANY
而不是实际地址,但当您的计算机上有多个网络接口时,它会很有用。

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


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

您的计算机可能有许多IP地址。(甚至可以将
127.0.0.1
视为与“真实”IP不同的IP。)在服务器套接字上,您可以选择要“监听”的地址。根据上面的示例,我认为将服务器套接字绑定到
127.0.0.1
意味着您只能在本地连接到该服务器程序

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

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

但是服务器也可以很容易地拥有多个公共IP地址。您的主机提供商将向您提供这些服务(并可能为此向您收取费用)

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

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


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

Posix(或BSD套接字)中的套接字编程比C中的套接字编程更多;我建议读一本关于Posix网络编程的好书。如果在Linux上,请阅读