【问题标题】:Port specification on an asio tcp client applicationasio tcp 客户端应用程序上的端口规范
【发布时间】:2017-01-12 20:05:09
【问题描述】:

我正在使用 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. 此外,只要第一个字节是 127(例如 127.1.2.3 连接),我似乎能够使用此 IP 地址的任何合法变体连接到同一台服务器。
  3. 客户端代码中有一个文字指定使用我认为是操作系统提供的“白天”TCP 服务进行连接。但是,服务器代码中没有对此的引用。为什么我必须指定要连接的特定服务?我还怀疑这项服务可能与第 1 点和第 2 点中的行为有关。

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

【问题讨论】:

    标签: tcp boost-asio


    【解决方案1】:

    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 在“白天”服务的情况下。

    【讨论】:

    • 谢谢。所以我可以删除白天文字并明确连接?另外,您对第 2 点有任何想法吗?
    • AFAIK 127.x.x.x 是一个环回,默认情况下该地址与所有接口绑定。
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2015-10-17
    • 2012-05-30
    • 2011-03-21
    • 2019-08-15
    相关资源
    最近更新 更多