asio tcp 客户端应用程序的端口规范

Port specification on an asio tcp client application

我正在使用 asio 用 C++ 重写一个 python 扭曲的服务器。我从

中设置了以下示例

http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/tutorial.html:

Daytime.1 - 同步 TCP 白天客户端
Daytime.3 - 异步 TCP 日间服务器

而且它们似乎运行正常。然而,令我困惑的是,当我创建扭曲的服务器时,它和客户端都需要明确指定 IP 地址和端口号。我在这里的体验略有不同:

  1. 在客户端应用程序上不需要指定端口号。我仅使用 127.0.0.1 作为命令行参数就可以成功连接到服务器。
  2. 此外,我似乎能够使用此 IP 地址的任何合法变体连接到同一台服务器,只要第一个字节是 127(例如 127.1.2.3 连接)。
  3. 客户端代码中有一个文字指定使用我假设的 OS 提供的 "daytime" TCP 服务进行连接。但是,服务器代码中没有对此的引用。为什么我必须指定要连接的特定服务?我还怀疑此服务可能与第 1 点和第 2 点中的行为有关。

现在我知道服务器有一个接受器套接字侦听,它只在收到请求后才建立连接,但我想在这里了解更多详细信息。

Daytime 在 *nix 世界中是众所周知的服务。您可以通过查看 /etc/services 文件来获取已知服务的列表,您可以在其中看到以下记录:

daytime          13/udp     # Daytime (RFC 867)
daytime          13/tcp     # Daytime (RFC 867)

service_name 与主机名一起提供时,tcp 端点使用以下版本的 getaddrinfo:

int error = ::getaddrinfo(host, service, &hints, result);   

查看手册页[强调我的]:

int
getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res)

The hostname and servname arguments are either pointers to NUL-terminated strings or the null pointer.  An acceptable
     value for hostname is either a valid host name or a numeric host address string consisting of a dotted decimal IPv4
     address or an IPv6 address.  The servname is either a decimal port number or a *service name listed in services(5)*.  At
     least one of hostname and servname must be non-null.

所以,简而言之,只要提供了正确的服务名称,它就知道要使用的正确端口号。 13 如果是 "daytime" 服务。