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

时间:2017-01-12 11:02:14

标签: tcp boost-asio

我使用asio在C ++中重写python twisted服务器。我已经从

中设置了以下示例

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. 客户端代码中有一个文字指定使用我假设的操作系统提供连接"白天" TCP服务。但是,服务器代码中没有对此的引用。为什么我必须指定要连接的特定服务?我还怀疑这项服务可能与第1点和第2点的行为有关。
  4. 现在我知道服务器有一个接收器套接字监听,只有在收到请求后才建立连接,但我想在这里提供更多细节。

1 个答案:

答案 0 :(得分:1)

白天是* 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服务。