Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

TCP, UDP and ICMP

Boost , Boost.Asio , Networking

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Повышаю. Asio обеспечивает поддержку готовых интернет-протоколов TCP, UDP и ICMP.

TCP Clients

Разрешение имени хоста выполняется с помощью решателя, где имена хоста и службы просматриваются и преобразуются в одну или несколько конечных точек:

ip::tcp::resolver resolver(my_io_service);
ip::tcp::resolver::query query("www.boost.org", "http");
ip::tcp::resolver::iterator iter = resolver.resolve(query);
ip::tcp::resolver::iterator end; // End marker.
while (iter != end)
{
  ip::tcp::endpoint endpoint = *iter++;
  std::cout << endpoint << std::endl;
}

Список конечных точек, полученных выше, может содержать как конечные точки IPv4, так и конечные точки IPv6, поэтому программа должна попробовать каждую из них, пока не найдет ту, которая работает. Это позволяет сохранить клиентскую программу независимой от конкретной IP-версии.

Для упрощения разработки протокольно-независимых программ клиенты TCP могут устанавливать соединения с помощью бесплатных функций connect() и async_connect(). Эти операции проверяют каждую конечную точку в списке, пока сокет не будет успешно подключен. Например, один звонок:

ip::tcp::socket socket(my_io_service);
boost::asio::connect(socket, resolver.resolve(query));

он будет синхронно проверять все конечные точки, пока одна из них не будет успешно подключена. Аналогично, асинхронное соединение может быть выполнено путем записи:

boost::asio::async_connect(socket_, iter,
    boost::bind(&client::handle_connect, this,
      boost::asio::placeholders::error));
// ...
void handle_connect(const error_code& error)
{
  if (!error)
  {
    // Start read or write operations.
  }
  else
  {
    // Handle error.
  }
}

Когда конкретная конечная точка доступна, сокет может быть создан и подключен:

ip::tcp::socket socket(my_io_service);
socket.connect(endpoint);

Данные могут быть прочитаны или записаны в подключенный сокет TCP с использованием функций receive(), async_receive(), send() или async_send(). Однако, поскольку это может привести к коротким записям или чтениям , приложение, как правило, будет использовать вместо этого следующие операции: read(), async_read(), write() и async_write().

TCP Servers

Программа использует акцептор для приема входящих TCP-соединений:

ip::tcp::acceptor acceptor(my_io_service, my_endpoint);
...
ip::tcp::socket socket(my_io_service);
acceptor.accept(socket);

После того, как розетка была успешно принята, она может быть прочитана или написана так, как показано для клиентов TCP выше.

UDP

Разрешение имени хоста UDP также выполняется с помощью решателя:

ip::udp::resolver resolver(my_io_service);
ip::udp::resolver::query query("localhost", "daytime");
ip::udp::resolver::iterator iter = resolver.resolve(query);
...

Сокет UDP обычно привязан к локальной конечной точке. Следующий код создаст разъем UDP IP версии 4 и привяжет его к «любому» адресу на порту 12345:

ip::udp::endpoint endpoint(ip::udp::v4(), 12345);
ip::udp::socket socket(my_io_service, endpoint);

Данные могут быть прочитаны или записаны в неподключенный сокет UDP с использованием функций receive_from(), async_receive_from(), send_to() или async_send_to(). Для подключенного гнезда UDP используйте функции receive(), async_receive(), send() или async_send().

ICMP

Как и в случае с TCP и UDP, разрешение имени хоста ICMP выполняется с помощью решателя:

ip::icmp::resolver resolver(my_io_service);
ip::icmp::resolver::query query("localhost", "");
ip::icmp::resolver::iterator iter = resolver.resolve(query);
...

Разъем ICMP может быть привязан к локальной конечной точке. Следующий код создаст IP-разъем ICMP версии 6 и свяжет его с любым адресом:

ip::icmp::endpoint endpoint(ip::icmp::v6(), 0);
ip::icmp::socket socket(my_io_service, endpoint);

Номер порта не используется для ICMP.

Данные могут быть прочитаны или записаны в несвязанный разъем ICMP с использованием функций receive_from(), async_receive_from(), send_to() или async_send_to().

See Also

ip::tcp, ip::udp, ip::icmp, daytime protocol tutorials, ICMP ping example.


PrevUpHomeNext

Статья TCP, UDP and ICMP раздела Boost.Asio Networking может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Networking ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:34:17/0.0070159435272217/0