Простой пример повышения уровня сервера/клиента не работает
-
23-08-2019 - |
Вопрос
Ускорение обучения и компиляция своего дневного серверного клиента. пример.Поскольку я не могу использовать порт 13, который указан в примере, я изменил только номера портов в примере сервера и клиента.Сервер работает нормально, но клиент, похоже, не подключается, и ошибок не выдается.
Входные данные для клиента: «127.0.0.1».
Сервер:
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
std::string make_daytime_string()
{
using namespace std; // For time_t, time and ctime;
time_t now = time(0);
return ctime(&now);
}
int main()
{
try
{
boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), 8087);
tcp::acceptor acceptor(io_service, endpoint);
for (;;)
{
tcp::iostream stream;
acceptor.accept(*stream.rdbuf());
stream << "test" << make_daytime_string();
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
И клиент:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: daytime_client <host>" << std::endl;
return 1;
}
tcp::iostream s(argv[1], 8087);
std::string line;
std::getline(s, line);
std::cout << line << std::endl;
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}
Решение
Несколько вещей помогут вам отладить это:
- На какой платформе вы работаете
- Какой компилятор вы используете, включая версию
- Какую версию Boost вы используете
Кроме того, следует проверить, привязан ли сервер к 127.0.0.1 или к внешнему интерфейсу.Попробуйте использовать IP-адрес вашего внешнего интерфейса вместо 127.0.0.1.Проверьте это в Windows с помощью ipconfig и в Linux с помощью ifconfig.
Другие советы
Что мне помогло, так это изменить способ создания конечной точки из
tcp::endpoint( tcp::v4(), port );
к
tcp::endpoint( boost::asio::ip::address::from_string("127.0.0.1"), port );
Первый метод создает конечную точку 0.0.0.0, которая отлично работает в Mac OS X, но выдает сообщение «недействительно» в Windows (XP, сборка с MSVC 2008).
Я был бы не против узнать, ПОЧЕМУ такая разница, но, по крайней мере, это работает.
Хм, все работает на версии Boost 1_36 и компиляторе msvc 2005.
Проверьте настройки брандмауэра.
Опция порта принимает строку, которая может быть именем службы, как «дневное время», а затем будет искать соответствующий порт или явно порт, но это должна быть строка:
tcp::iostream s(argv[1], "8087");