2017-01-12 54 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