2017-01-12 4 views
0

Я переписываю скриптовый сервер python в C++ с помощью asio. Я настроил следующие примеры изСпецификация порта в клиентском приложении asio tcp

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

Daytime.1 - Синхронный TCP DAYTIME клиенту
Daytime.3 - асинхронная TCP сервера день

и кажется, что они будут работать правильно. Однако меня озадачивает то, что когда я создал скрученный сервер, он и клиентская сторона нуждались в явной спецификации IP-адресов и номеров портов. У меня есть несколько иной опыт:

  1. В клиентском приложении не требуется спецификация номера порта. Я могу успешно подключиться к серверу, используя только 127.0.0.1 в качестве аргумента командной строки.
  2. Также я могу подключиться к одному и тому же серверу с любым юридическим вариантом этого IP-адреса, если первый байт составляет 127 (например, 127.1.2.3 подключается).
  3. В клиентском коде есть буквальная буква, указывающая на соединение с использованием того, что, как я полагаю, является предоставленной ОС «дневной» службой TCP. Однако в коде сервера нет ссылки на это. Почему я должен указать конкретную услугу для подключения? Я также подозреваю, что эта услуга может быть связана с поведением в точках 1 и 2.

Теперь я знаю, что на сервере есть приемник-приемник-приемник, который устанавливает соединение только после получения запроса, но мне бы хотелось, чтобы некоторые подробнее здесь.

ответ

1

Дневное время - это хорошо известное обслуживание в мире * nix. Вы можете получить список известных службы, глядя на /etc/services файл, и вы можете увидеть ниже записей в ней:

daytime   13/udp  # Daytime (RFC 867) 
daytime   13/tcp  # Daytime (RFC 867) 

Когда service_name обеспечивается с именем хоста, ТСР конечная точка использует ниже версии 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 - это loopback, и по умолчанию адрес привязан ко всем интерфейсам. – Arunmu

 Смежные вопросы

  • Нет связанных вопросов^_^