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 地址和端口号。我在这里的体验略有不同:
- 在客户端应用程序上不需要指定端口号。我仅使用 127.0.0.1 作为命令行参数就可以成功连接到服务器。
- 此外,我似乎能够使用此 IP 地址的任何合法变体连接到同一台服务器,只要第一个字节是 127(例如 127.1.2.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" 服务。
我正在使用 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 地址和端口号。我在这里的体验略有不同:
- 在客户端应用程序上不需要指定端口号。我仅使用 127.0.0.1 作为命令行参数就可以成功连接到服务器。
- 此外,我似乎能够使用此 IP 地址的任何合法变体连接到同一台服务器,只要第一个字节是 127(例如 127.1.2.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" 服务。