Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2019, 13:28   #51
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Как угодно
p51x вне форума Ответить с цитированием
Старый 25.08.2019, 14:36   #52
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Здравствуйте

Пытаюсь синхронно прочитать, какое либо входящее сообщение, вроде бы делаю, как в примере, но ничего не читается.
Вот делаю так:
Код:
ina main()
{

int port;
port = 80 // порт по которому boost будет слушать Входящие запросы

boost::asio::io_service io_services;  // обьявление ио сервиса
boost::system::error_code ec_acceptor;  // обьявление ошибки

boost::asio::ip::tcp::acceptor Acceptorka(io_services);  // обьявление самого ацептора
boost::asio::ip::tcp::endpoint endpointo_acceptor(boost::asio::ip::tcp::v4(), port); // обьявление конечно точки по которой аццептор будет слушать запросы

tcp::acceptor the_acceptor(io_services, endpointo_acceptor); // привязка аццептора к конечно точке
tcp::socket socket_acceptor(io_services); // обьявление сокета
the_acceptor.accept(socket_acceptor);  // запуск аццептора на прослушку

/// читаем Входящее сообщение:
boost::asio::streambuf Response_read_acceptor;   // Обьявим boost asio буффер

boost::asio::read(socket_acceptor, Response_read_acceptor, boost::asio::transfer_exactly(10), ec_acceptor); // прочитаем только первые 10 байт
	
istream Response_istream_acceptor(&Response_read_acceptor);  // Обьявим поток для чтения из boost asio буффер
	
string response_getline_acceptor;  // создадим string куда будем записывать считанные данные из Response_istream_acceptor

cout << "Response_read_acceptor.size(): " << ":" << Response_read_acceptor.size() << endl;  // выведем на консоль сробщение о кол-ве данных в буффере.
}
Я запускаю, после запуска в браузере просто открываю, любой http сайт, то есть браузер посылает запрос на этот сервер для получения html странички и сервер браузеру присылает ответ, и я так понял, что аццептор так же этот ответ должен прочитать !?
Но ничего не происходит, просто запускается пустая консолька, как будто бы the_acceptor.accept(socket_acceptor ) в ожидаение входящих сообщений, но ничего больше не происходит.

Подскажите пожалуйста, что не так я сделал ?

Последний раз редактировалось Android1; 25.08.2019 в 14:40.
Android1 вне форума Ответить с цитированием
Старый 25.08.2019, 15:50   #53
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
Я запускаю, после запуска в браузере просто открываю, любой http сайт, то есть браузер посылает запрос на этот сервер для получения html странички и сервер браузеру присылает ответ, и я так понял, что аццептор так же этот ответ должен прочитать !?
С какого перепугу?

Цитата:
Сообщение от Android1 Посмотреть сообщение
Но ничего не происходит, просто запускается пустая консолька, как будто бы the_acceptor.accept(socket_acceptor ) в ожидаение входящих сообщений, но ничего больше не происходит.
Имеено так.

Цитата:
Сообщение от Android1 Посмотреть сообщение
Подскажите пожалуйста, что не так я сделал ?
Забыли прочитать основы о работе сети.
p51x вне форума Ответить с цитированием
Старый 25.08.2019, 19:10   #54
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
С какого перепугу?
.
Но ведь, когда формируется resolve указывается 80ый порт, для http.
Android1 вне форума Ответить с цитированием
Старый 25.08.2019, 19:21   #55
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

0. Последуйте совету из моего поста выше.
1. Резолв, https://en.wikipedia.org/wiki/Domain_Name_System, обычно использует 53 порт на сервере и удп.
2. 80й порт на веб-сервере и 80й порт на вашей машине это разные порты.
3. Резолв посланный браузером, придет в открытый браузером сокет и порт там не обязан быть 80. Тем более вы его заняли.
p51x вне форума Ответить с цитированием
Старый 29.08.2019, 19:15   #56
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что-то вы явно не о том думаете... Как вы вообще что-то собрались принимать, если нет ни начала, ни конца?
Извините, вот еще раз просто пример:

Я создаю простой аццептор:
Код:
int port = 80;

boost::system::error_code ec_acceptor;
boost::asio::io_service io_services;

boost::asio::ip::tcp::endpoint endpointo_acceptor(boost::asio::ip::tcp::v6(), port);
boost::asio::ip::tcp::acceptor the_acceptor(io_services, endpointo_acceptor);

the_acceptor.accept(socket_acceptor); // Запуская аццептор
boost::asio::read(socket_acceptor, Response_read_acceptor, boost::asio::transfer_all(), ec_acceptor); // и читаю входящий запрос
То есть запускаю аццептор, с браузера телефона набираю ip адресс на котором запущен аццептор, браузер шлет естесвенно get запрос:
Код:
GET / HTTP/1.1
Host: xxx.xxx.xxx.xx
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-A510F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Read в свою очередь читает это, но завершить работу не может, так как браузер требует keep-alive, и функция read уходит в бесконечное ожидание или ошибки или конца потока, но конца потока нет, так как браузер не закрывает соединение. И естесвенно я не могу заранее знать кол-во байт, которое мне каждый раз будет слать чей то браузер.
Android1 вне форума Ответить с цитированием
Старый 15.09.2019, 14:16   #57
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Подскажите пожалуйста, как же все таки должен работать этот keep-alive ?
В общем смысле, как я понял keep-alive - это постоянное соединение клиент-сервер, я для себя понял грубо - это как соединение на постоянно открытом сокете. То есть socket.close делать нельзя.

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

Но сколько тогда клиентов вообще может подключится к данному серверу одновременно ?
Ведь на каждого клиента придется создавать свой сокет и выделять под него поток. Ну грубо можно создать 300 thread или async потоков по 300 клиентов, ну 500 максимум. И все ? То есть следуя этой логике одновременно на сервер с keep-alive сможет подключится 500 одновременно человек.

Но ведь сервера работают, кто нибудь может это обьяснить, как же все таки работает сервер с режимом keep-alive ?
Android1 вне форума Ответить с цитированием
Старый 15.09.2019, 14:21   #58
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
500 максимум
почему?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.09.2019, 14:57   #59
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
почему?
Ну, просто, как я понял более уже сильно снижает эффективность.
Android1 вне форума Ответить с цитированием
Старый 23.09.2019, 19:37   #60
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Здравствуйте,

Подскажите пожалуйста, почему boos::asio::buffer() не хочет принимать указатель на new ?
Код:
char *buff;
buff = new char[1];
buff[0]='f';

boost::asio::write(socket, boost::asio::buffer(buff));
Ведь обычный char[]="f" принимает.
Android1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Boost] ASIO Buffer S.Ruslan C/C++ Сетевое программирование 7 25.03.2019 13:34
boost/asio MayhemWithMercy C/C++ Сетевое программирование 1 11.06.2014 17:44
boost ASIO сериализация Kukurudza Общие вопросы C/C++ 2 06.12.2011 13:38
Boost::Asio on Mingw russian-stalker Общие вопросы C/C++ 0 05.01.2011 16:27
Boost (asio + thread) - noncopyable MInner Общие вопросы C/C++ 1 06.12.2009 16:41