如何使 .cpp 文件充当可访问服务器
How to make a .cpp file to act as an accessible server
我用Linux(CentOS7.0)和C++写了一个简单的程序。它是一个非常小的服务器,它向客户端发送回一串字符。但我的问题是我不知道如何使用 IP 地址访问该服务器?
我使用了 Linux 套接字接口 (Berkeley),在定义地址的部分,我的代码执行以下操作:
serverObject.
sin_family = AF_INET;
serverObject.sin_addr.
s_addr = htonl(INADDR_ANY);
serverObject.
sin_port = htonl(portNumber);
我使用 INADDR_ANY
作为我的服务器地址,它在其定义中定义为:
/* Address to accept any incoming messages. */
现在,我应该如何 运行 服务器,然后使用我的简单客户端程序向它发送请求。我的简单客户端程序接受一个 IP 地址作为它的目标地址,这个地址应该是发往服务器的地址。那我应该怎么联系呢?
作为服务器程序员,您决定监听的端口,而不是地址。
互联网地址由您的互联网提供商提供,或 127.0.0.1 在您自己的机器上测试。
互联网上有很多网页提供的工具可以告诉您当前的 public 地址(搜索我的 IP 是什么)。
大多数 "home" 互联网路由器实现 NAT:它们有一个互联网地址并将它们映射到许多设备,这些设备携带要更改的端口号(您的端口 80 成为端口(例如)2345外部)。要允许您家外的客户端访问您的服务器,您需要配置路由器以映射服务器端口,例如,您的 public 端口 80 映射到您的服务器端口 80。
话虽如此,您应该能够通过地址和端口将客户端连接到服务器。
如果您想使用名称 (example.org) 而不是 IP (93.184.216.34),则使用域名服务器。但那是另一个话题了。
INADDR_ANY
指定应绑定系统中的所有活动网络接口。因此,如果您连接到多个网络,您将能够与来自所有这些网络的连接进行通信。不过,大多数系统通常只有一个,这仍然意味着如果绑定到该接口的 IP 发生变化,您仍将绑定到该接口。
因此,一旦指定INADDR_ANY
,您需要根据以下规则发起连接:
- 如果您从同一台物理计算机进行连接,最简单的方法是使用环回接口 (127.0.0.1)。但是,您仍然可以执行 (2)。
- 如果您从另一台机器连接,您需要从那台机器选择服务器的可访问IP地址。如上所述,如果您的服务器只连接到一个网络,这将只是 服务器的 IP 地址。在内部网络中,这通常是 192.168.x.y 或 10.0.x.y 之类的东西——但它不是必须的。
- 如果您从使用网关访问您的服务器的不同网络进行连接,那么您将需要在相关路由器中设置端口转发,以便当它们接收到端口 X 的连接时,它们将知道在内部将其传输到您的服务器。
我用Linux(CentOS7.0)和C++写了一个简单的程序。它是一个非常小的服务器,它向客户端发送回一串字符。但我的问题是我不知道如何使用 IP 地址访问该服务器?
我使用了 Linux 套接字接口 (Berkeley),在定义地址的部分,我的代码执行以下操作:
serverObject.
sin_family = AF_INET;
serverObject.sin_addr.
s_addr = htonl(INADDR_ANY);
serverObject.
sin_port = htonl(portNumber);
我使用 INADDR_ANY
作为我的服务器地址,它在其定义中定义为:
/* Address to accept any incoming messages. */
现在,我应该如何 运行 服务器,然后使用我的简单客户端程序向它发送请求。我的简单客户端程序接受一个 IP 地址作为它的目标地址,这个地址应该是发往服务器的地址。那我应该怎么联系呢?
作为服务器程序员,您决定监听的端口,而不是地址。
互联网地址由您的互联网提供商提供,或 127.0.0.1 在您自己的机器上测试。
互联网上有很多网页提供的工具可以告诉您当前的 public 地址(搜索我的 IP 是什么)。
大多数 "home" 互联网路由器实现 NAT:它们有一个互联网地址并将它们映射到许多设备,这些设备携带要更改的端口号(您的端口 80 成为端口(例如)2345外部)。要允许您家外的客户端访问您的服务器,您需要配置路由器以映射服务器端口,例如,您的 public 端口 80 映射到您的服务器端口 80。
话虽如此,您应该能够通过地址和端口将客户端连接到服务器。
如果您想使用名称 (example.org) 而不是 IP (93.184.216.34),则使用域名服务器。但那是另一个话题了。
INADDR_ANY
指定应绑定系统中的所有活动网络接口。因此,如果您连接到多个网络,您将能够与来自所有这些网络的连接进行通信。不过,大多数系统通常只有一个,这仍然意味着如果绑定到该接口的 IP 发生变化,您仍将绑定到该接口。
因此,一旦指定INADDR_ANY
,您需要根据以下规则发起连接:
- 如果您从同一台物理计算机进行连接,最简单的方法是使用环回接口 (127.0.0.1)。但是,您仍然可以执行 (2)。
- 如果您从另一台机器连接,您需要从那台机器选择服务器的可访问IP地址。如上所述,如果您的服务器只连接到一个网络,这将只是 服务器的 IP 地址。在内部网络中,这通常是 192.168.x.y 或 10.0.x.y 之类的东西——但它不是必须的。
- 如果您从使用网关访问您的服务器的不同网络进行连接,那么您将需要在相关路由器中设置端口转发,以便当它们接收到端口 X 的连接时,它们将知道在内部将其传输到您的服务器。