2017-01-12 53 views
0

我正在使用asio在C++中重写python扭曲的服务器。我已经建立了下面的例子从asio tcp客户端应用程序的端口规范

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

Daytime.1 - 同步TCP daytime客户
Daytime.3 - 异步TCP daytime服务器

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

  1. 在客户端应用程序中,不需要规定端口号。我可以通过仅使用127.0.0.1作为命令行参数成功连接到服务器。
  2. 此外,只要第一个字节是127(例如127.1.2.3连接),我似乎可以连接到具有此IP地址的任何合法变体的同一台服务器。
  3. 客户端代码中有一个字面意思,指定使用我提供的操作系统提供的“白天”TCP服务进行连接。但是,在服务器代码中没有提及这一点。为什么我必须指定要连接的特定服务?我也怀疑这项服务可能与第1点和第2点的行为有关。

现在我知道服务器有一个接受者套接字监听,它只在接收到请求后才建立连接,但我想要一些更多细节在这里。

回答

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“白天”服务。

+0

谢谢。所以我可以删除白天文字并明确连接? 另外,你有关于第2点的任何想法? –

+1

AFAIK 127.x.x.x是一个环回,默认情况下该地址与所有接口绑定。 – Arunmu