Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 01.02.17 20:16
Оценка: +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>P.S. 21-ый век на дворе, но как оказалось нигде не найти примера нормального асинхронного TCP клиента. Жесть! Вообще разочарован.


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

Если я там сделал socket.shutdownSend(), то на следующий socket.send() ошибка. А как возобновить передачу? Жесть.
Если сокеты блокирующие, то таймауты не работают. Если не блокирующие то вообще беда. Как там товарищ привел в пример, SocketReactor, так оно вообще всё наглухо вешает, ибо эти хэндлеры стреляют. Жесть.
Socket::receiveBytes() всегда ноль возвращает, типа graceful shutdown. Жесть!!!
Ну как этим дерьмом пользоваться то?
Про многопоточность вообще молчу, сокеты там даже и не работают.

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

Почему везде избегают написание примера TCP клиента с использованием библиотеки? Почему везде только примеры сервера?

Жаль что Qt нельзя использовать в проекте, там всё это за 5 мин пишется.

Псевдо:

class client_connection
{
public:
  client_connection() {
    m_socket.connect(...);
    // register some handlers
    ...
  }
  ~client_connection() {
    m_socket.disconnect();
  }

  void on_read_data() {
    int bytes = m_socket.read();
    ...
  }

  void send(unsigned char* data, int length) {
    m_socket.send(data, length);
  }
  
private:
  socket m_socket;
}

// где то используем

class some_thread_or_widget_or_some_shit {
public:
  void OnButtonClickOrJustAnythingElse() {
    m_client.send(...);
    m_client.getData(...);

    m_client.send(...);
    m_client.getData(...);

    m_client.send(...);
    m_client.getData(...);

    m_client.send(...);
    m_client.getData(...);

    m_client.send(...);
    m_client.send(...);
    m_client.send(...);
    m_client.getData(...);
  }
private:
  client_connection m_client;
}


Я сильно много хочу?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Отредактировано 03.02.2017 4:39 Мёртвый Даун . Предыдущая версия . Еще …
Отредактировано 02.02.2017 8:59 Мёртвый Даун . Предыдущая версия .
Re: Вопрос НЕ про Poco! Любая простая net библиотека
От: c-smile Канада http://terrainformatica.com
Дата: 02.02.17 04:20
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Здравствуйте, Мёртвый Даун, Вы писали:


МД>>P.S. 21-ый век на дворе, но как оказалось нигде не найти примера нормального асинхронного TCP клиента. Жесть! Вообще разочарован.


МД>Псевдо:


И где там что-нить асинхронное?

Посмотри на SAL от Книжника: http://www.garret.ru/SAL/ReadMe.htm

Писано давно но работает.
Re: Вопрос НЕ про Poco! Любая простая net библиотека
От: okman Беларусь https://searchinform.ru/
Дата: 02.02.17 06:26
Оценка: +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Сейчас совсем нет никаких нормальных библиотек для работы с сокетами?


Boost.Asio не рассматривается?
Re[2]: Вопрос НЕ про Poco! Любая простая net библиотека
От: solano  
Дата: 02.02.17 06:52
Оценка: +1
Здравствуйте, okman, Вы писали:

O>Boost.Asio не рассматривается?


Поддерживаю. Отличный вариант. Есть и асинхронность. Есть и таймеры и возможность сделать таймауты для операций.

И за примерми далеко ходить не надо. Тыц.
С наилучшими пожеланиями.
Отредактировано 02.02.2017 6:55 CoremanR . Предыдущая версия .
Re[2]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 02.02.17 08:05
Оценка: +1 -2 :))) :)
Здравствуйте, okman, Вы писали:

O>Boost.Asio не рассматривается?


Скорее всего нет.
1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет?
2) примеры непонятные, ничего дальше int main() { } нету (а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё! Задача стара как кал мамонта. Мне нужно вписать всё в архитектуру лохматого проекта, в котором один идиот N лет назад заюзал дерьмо под названием Poco Library. У меня с Poco ничего не получается. Примеров нет. Ничего не работает.
3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 02.02.17 08:06
Оценка:
Здравствуйте, solano, Вы писали:

S>Здравствуйте, okman, Вы писали:


O>>Boost.Asio не рассматривается?


S>Поддерживаю. Отличный вариант. Есть и асинхронность. Есть и таймеры и возможность сделать таймауты для операций.


S>И за примерми далеко ходить не надо. Тыц.


Выделенное всё ненужно. Нужно просто отправить, принять!
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Вопрос НЕ про Poco! Любая простая net библиотека
От: rumit7  
Дата: 02.02.17 08:24
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

O>>Boost.Asio не рассматривается?

МД>Скорее всего нет.
МД>1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет?

boost asio существует уже не первый год, в течении всего периода существования на нем писалось большое кол-во промышленного кода.. это по моему уже говорит о многом.
ну и загуглил для Вас: Who is using Asio?

МД>2) примеры непонятные, ничего дальше int main() { } нету

даже в офиц доке куча рабочих примеров, и если читать и вникать, то уже понятно куда плясать дальше, но можно и смотреть здесь или здесь. Чтобы найти эти примеры нужно конечно больше времени, чем написать сообщение на рсдн-е, но это возможно)

МД>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё!


мдэ...

МД>Задача стара как кал мамонта. Мне нужно вписать всё в архитектуру лохматого проекта, в котором один идиот N лет назад заюзал дерьмо под названием Poco Library. У меня с МД>Poco ничего не получается. Примеров нет. Ничего не работает.


мне начинает казаться, что Poco Library не причем, может Вам лучше отдать код кому-то другому, может аутсорсинг.

МД>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.


если внимательно смотреть примеры, то можно найти например асинхронный HTTP Client
Re[4]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 02.02.17 08:40
Оценка: :))
Здравствуйте, rumit7, Вы писали:

R>Здравствуйте, Мёртвый Даун, Вы писали:


O>>>Boost.Asio не рассматривается?

МД>>Скорее всего нет.
МД>>1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет?

R>boost asio существует уже не первый год, в течении всего периода существования на нем писалось большое кол-во промышленного кода.. это по моему уже говорит о многом.

R>ну и загуглил для Вас: Who is using Asio?

Это абсолютно ни о чем не говорит.

МД>>2) примеры непонятные, ничего дальше int main() { } нету

R>даже в офиц доке куча рабочих примеров, и если читать и вникать, то уже понятно куда плясать дальше, но можно и смотреть здесь или здесь. Чтобы найти эти примеры нужно конечно больше времени, чем написать сообщение на рсдн-е, но это возможно)

Как я и писал выше, ни одного вменяемого примера, все примеры только сервера, клиента нет.

МД>>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё!


R>мдэ...


Точняк. Оказывается для таких простых действий не нужны никакие таймеры, таймауты, дэдлайны, перформансы и прочее...

МД>>Задача стара как кал мамонта. Мне нужно вписать всё в архитектуру лохматого проекта, в котором один идиот N лет назад заюзал дерьмо под названием Poco Library. У меня с МД>Poco ничего не получается. Примеров нет. Ничего не работает.


R>мне начинает казаться, что Poco Library не причем, может Вам лучше отдать код кому-то другому, может аутсорсинг.


Да я бы с удовольствием вообще этим дерьмом не занимался.

МД>>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.


R>если внимательно смотреть примеры, то можно найти например асинхронный HTTP Client


Не то! Я в первом посте попытался набросать что мне надо.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[5]: Вопрос НЕ про Poco! Любая простая net библиотека
От: so5team https://stiffstream.com
Дата: 02.02.17 11:34
Оценка: +2 :))
Здравствуйте, Мёртвый Даун, Вы писали:

МД>>>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё!

МД>Точняк. Оказывается для таких простых действий не нужны никакие таймеры, таймауты, дэдлайны, перформансы и прочее...
МД>>>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.

Вы кого-то явно обманываете. Если нужно просто отправить и просто прочитать ответ, то вам как раз и подойдет синхронная работа с сокетами (см. в сторону прямого использования StreamSocket). Если же вам синхронная работа почему-то не нужна и вы хотите именно асинхронной, тогда в POCO прямая дорога к SocketReactor. Но тут уж без понимания EventHandler-ов, таймаутов, таймеров и прочее не обойтись.

R>>мне начинает казаться, что Poco Library не причем, может Вам лучше отдать код кому-то другому, может аутсорсинг.


МД>Да я бы с удовольствием вообще этим дерьмом не занимался.


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

PS. POCO хорошая библиотека, не такая продвинутая, как Asio или ACE, но зато простая как две копейки. Там по исходникам за пару часов можно разобраться что и как работает. Просто наймите кого-нибудь, кто умеет программировать. Ну или пусть на форуме вопросы задаст кто-то менее истеричный и более вменяемый.
Re: Вопрос НЕ про Poco! Любая простая net библиотека
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.02.17 11:43
Оценка: +1
Здравствуйте, Мёртвый Даун, Вы писали:


МД>Если я там сделал socket.shutdownSend(), то на следующий socket.send() ошибка. А как возобновить передачу? Жесть.



POCO конечно не айс, но в чем проблема? Shutdown на сокете говорит о том, что всё — сокет закрывается. Соответственно, никакой send уже не будет на нем работать. Нужно другой сокет создавать. Это не POCO, это сокеты беркли так работают
Маньяк Робокряк колесит по городу
Re: Вопрос НЕ про Poco! Любая простая net библиотека
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.02.17 11:55
Оценка: +1
Здравствуйте, Мёртвый Даун, Вы писали:

Не буду говорить именно про Poco, но:

МД>Если я там сделал socket.shutdownSend(), то на следующий socket.send() ошибка. А как возобновить передачу? Жесть.


Если речь о конкретном объекте сокета, то никак, и это ограничение не Poco. Это так и в BSD sockets (и в Unix, и в Windows), и в других сокетных интерфейсах, типа TLI. Не хочешь такого эффекта — не делай shutdown. После него — только закрыть и открыть новый.

МД>Если сокеты блокирующие, то таймауты не работают. Если не блокирующие то вообще беда. Как там товарищ привел в пример, SocketReactor, так оно вообще всё наглухо вешает, ибо эти хэндлеры стреляют. Жесть.


Честно говоря, начинаю сомневаться в качестве понимания тобой общего подхода к работе с сокетами.
Или покажи конкретный пример.

МД>Socket::receiveBytes() всегда ноль возвращает, типа graceful shutdown. Жесть!!!


Что-то про последнее сомневаюсь.

МД>Ну как этим дерьмом пользоваться то?

МД>Про многопоточность вообще молчу, сокеты там даже и не работают.

В чём это выражается?

МД>Сейчас совсем нет никаких нормальных библиотек для работы с сокетами? Это же беда совсем. Я уже незнаю, хочу очень простого, но побольше чем хэлоу ворлд.


МД>Жаль что Qt нельзя использовать в проекте, там всё это за 5 мин пишется.


МД>Псевдо:


Ну я посмотрел на это — чисто синхронный код — а зачем вообще тогда какая-то обёртка?
The God is real, unless declared integer.
Re: Вопрос НЕ про Poco! Любая простая net библиотека
От: ksd Россия  
Дата: 02.02.17 12:01
Оценка:
МД>Я сильно много хочу?

В похожей ситуации пользовались вот этим: Practical C++ Sockets
Только сам реализовал желаемую "getData" прикрутив перед recv select.
Re[6]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 03.02.17 04:43
Оценка:
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, Мёртвый Даун, Вы писали:


МД>>>>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё!

МД>>Точняк. Оказывается для таких простых действий не нужны никакие таймеры, таймауты, дэдлайны, перформансы и прочее...
МД>>>>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.

S>Вы кого-то явно обманываете. Если нужно просто отправить и просто прочитать ответ, то вам как раз и подойдет синхронная работа с сокетами (см. в сторону прямого использования StreamSocket). Если же вам синхронная работа почему-то не нужна и вы хотите именно асинхронной, тогда в POCO прямая дорога к SocketReactor. Но тут уж без понимания EventHandler-ов, таймаутов, таймеров и прочее не обойтись.


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

SocketReactor и SocketConnector непонятно как ими пользоваться, полный отстой. Всё делается внутри, непонятно как через них чтото отправить и принять.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[7]: Вопрос НЕ про Poco! Любая простая net библиотека
От: so5team https://stiffstream.com
Дата: 03.02.17 09:16
Оценка: 29 (3) +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Ну разумеется логика чуть сложнее чем я привел выше... поэтому синхронная работа не подходит...


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

МД>SocketReactor и SocketConnector непонятно как ими пользоваться, полный отстой. Всё делается внутри, непонятно как через них чтото отправить и принять.


Давайте так: есть то, что вы не понимаете, а есть полный отстой. Весьма вероятно, что в вашем случае с POCO это не пересекающиеся множества.

Суть реактора такова -- это объект, в который запихивают сокеты и объекты-хендлеры для опеределенных событий с этими сокетами. Реактор висит на select-е и когда с конкретным сокетом происходит какое-то событие, на который зарегистрирован объект-хендлер, то этот объект-хендлер вызывается. Например, можно зарегистрировать сокет и хендлер для события "сокет готов к чтению". Соответственно, этот хендлер будет вызван когда из сокета можно что-то прочитать. Аналогично и с "сокет готов к записи".

Использование реакторов происходит следующим образом: создается реактор, открываются нужные сокеты. Когда нам нужно писать в сокет, мы регистрируем сокет в реакторе с хендлером для события WriteableNotification. Реактор дождется готовности сокета к записи и дернет наш хендлер. Мы запишем в сокет свои данные. Если записали не все, то не удаляем свой хендлер и реактор опять дергает хендлер когда сокет оказывается готов к записи. Если же нам нужно читать данные из сокета, то мы регистрируем для сокета хендлер для события ReadableNotification и нас реактор дергает когда сокет готов к чтению.

Обычно эти хендлеры реализуются в виде класса, у которого есть методы для событий WriteableNotification, ReadableNotification, ErrorNotification, TimeoutNotification. Для каждого экземпляра сокета создается экземпляр такого класса (он называется EventHandler), который и привязывается вместе с сокетом к реактору. Пример этого как раз и можно увидеть в EchoServer-е.

SocketConnector же решает частную задачу -- асинхронный коннект. Это шаблонный класс, который параметризуется типом конкретного EventHandler-а. Вы создаете объект SocketConnector<YourEventHandler> и связываете его с SocketReactor-ом. Далее SocketConnector пытается установить коннект к удаленному узлу. Если это получается, то он создает экземпляр YourEventHandler и отдает ему конкретный сокет и ссылку на этот самый SocketReactor (сам SocketConnector при этот от SocketReactor-а отвязывается).

Так что вам нужно создать свой класс EventHandler-а, определить в нем реакцию на события WriteableNotificator, ReadableNotificator (как минимум эти), создать SocketReactor и SocketConnector<YourEventHandler>. После чего запустить SocketReactor на какой-то рабочей нити. SocketConnector выполнит подключение к удаленном узлу и сам создаст экземпляр вашего EventHandler-а для конкретного StreamSocket-а. Далее вы уже в этом EventHandler-е делаете все, что вам нужно.


Вообще, вся эта хрень с Reactor-ами, Acceptor-ами и Connector-ами очень хорошо разобрана авторами библиотеки ACE. Есть даже несколько книжек по ACE на русском языке. Поищите, там можно узнать идеологию использования Reactor-ов и EventHandler-ов в подробностях. После этого использовать штуки из POCO будет проще.
Re[8]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 03.02.17 09:51
Оценка:
Здравствуйте, so5team, Вы писали:

Именно с этим я уже и разобрался... EchoServer там единственный пример дерьма, но опять же сервера (почему? почему нигде нет примера клиента? причем не только в Poco). Я правда эту срань под названием Poco уже удалил, и больше никогда в жизни не поставлю, но раз уж вы ответили, то продолжу только изза этого...
Попытался создать пример, который бы вписался в архитектуру моего проекта, но разумеется это дерьмо не работает и никогда не может работать, потому что это же Poco.
class MySocketReactor: public Poco::Net::SocketReactor
{
public:
    // чтобы проц не грузить
    void onBusy() {
        Poco::Thread::yield();
        Poco::Thread::sleep(1);
    }
};

class MyClientServiceHandler
{
public:
    MyClientServiceHandler(Poco::Net::StreamSocket& socket, MySocketReactor& reactor)
: m_socket(socket)
, m_reactor(reactor)
, m_OnReadable(*this, &MyClientServiceHandler::OnReadable)
, m_OnWritable(*this, &MyClientServiceHandler::OnWritable)
, m_OnTimeout(*this, &MyClientServiceHandler::OnTimeout)
, m_sendBuffer(1024, true)
, m_receiveBuffer(1024, true)
{
    m_socketReactorThread.start(m_reactor);
    
    m_reactor.addEventHandler(m_socket, m_OnReadable);
    m_reactor.addEventHandler(m_socket, m_OnWritable);
    m_reactor.addEventHandler(m_socket, m_OnTimeout);
    
    m_sendBuffer.readable += Poco::delegate(this, &MyClientServiceHandler::OnSend);
        m_receiveBuffer.writable += Poco::delegate(this, &MyClientServiceHandler::OnReceive);
}

~MyClientServiceHandler()
{
    m_reactor.removeEventHandler(m_socket, m_OnReadable);
    m_reactor.removeEventHandler(m_socket, m_OnWritable);
    m_reactor.removeEventHandler(m_socket, m_OnTimeout);
    
    m_sendBuffer.readable -= Poco::delegate(this, &MyClientServiceHandler::OnSend);
    m_receiveBuffer.writable -= Poco::delegate(this, &MyClientServiceHandler::OnReceive);
    
    m_reactor.stop();
    m_socketReactorThread.join();
}
    
void OnReadable(Poco::Net::ReadableNotification* notification)
{
    notification->release();
    
    try {
        int receiveBytes = m_socket.receiveBytes(m_receiveBuffer);
        if (receiveBytes > 0) {
            // здесь делаем важную работу...
        } else {
            delete this;
        }
    } catch (Poco::Exception &e) {
        delete this;
    }
}

void OnWritable(Poco::Net::WritableNotification* notification);

void OnTimeout(Poco::Net::TimeoutNotification* notification)
{
    notification->release();
    m_reactor.stop();
    delete this;
}
    
void OnSend(bool &flag)
{
    if (flag)
        m_reactor.addEventHandler(m_socket, m_OnWritable);
    else
        m_reactor.removeEventHandler(m_socket, m_OnWritable);
}
void OnReceive(bool &flag);

void send(const MyMessage &buffer)
{
        // где вызвать этот метод, если у меня нет экземляра клиента?
    m_sendBuffer.copy(buffer.data(), buffer.size());
}
private:
    Poco::Net::StreamSocket m_socket;
    MySocketReactor &m_reactor;
    Poco::Observer<MyClientServiceHandler, Poco::Net::ReadableNotification> m_OnReadable;
    Poco::Observer<MyClientServiceHandler, Poco::Net::WritableNotification> m_OnWritable;
    Poco::Observer<MyClientServiceHandler, Poco::Net::TimeoutNotification>  m_OnTimeout;

    Poco::Thread m_socketReactorThread;
    
    Poco::FIFOBuffer m_sendBuffer;   // собственно основная замута была ради этого, мне нужны буферы которые оповещают, и хэндлеры
    Poco::FIFOBuffer m_receiveBuffer;
    
    friend std::ostream& operator << (std::ostream&, const MyClientServiceHandler&);
};

class MySocketConnector: public Poco::Net::SocketConnector<MyClientServiceHandler>
{
public:
    MySocketConnector(Poco::Net::SocketAddress& address, MySocketReactor& reactor)
: SocketConnector<MyClientServiceHandler>(address, reactor)
{
    reactor.addEventHandler(socket(), Poco::Observer<MySocketConnector, Poco::Net::TimeoutNotification>(*this, &MySocketConnector::OnTimeout));
    reactor.addEventHandler(socket(), Poco::Observer<MySocketConnector, Poco::Net::ShutdownNotification>(*this, &MySocketConnector::OnShutdown));
}
    void OnShutdown(Poco::Net::ShutdownNotification* notification);
    void OnTimeout(Poco::Net::TimeoutNotification* notification);
    void OnError(int error);

protected:
    MyClientServiceHandler* createServiceHandler() {
    return new MyClientServiceHandler(_socket, *_pReactor);
    }
};

// Используем это дерьмо

class Connection
{
public:
    Connection() : m_connector(m_socketAddress, m_reactor) { ... }
private:
    Poco::Net::SocketAddress m_socketAddress;
    Poco::Net::SocketReactor m_reactor;
    MySocketConnector m_connector; // как это дерьмо использовать? как мне вызвать самый важный метод send(const MyMessage) ?
}


В результате у меня нигде нет доступа к объекту класса MyClientServiceHandler. Как мне положить в исходящий буфер?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Отредактировано 03.02.2017 9:58 Мёртвый Даун . Предыдущая версия . Еще …
Отредактировано 03.02.2017 9:57 Мёртвый Даун . Предыдущая версия .
Отредактировано 03.02.2017 9:55 Мёртвый Даун . Предыдущая версия .
Re[9]: Вопрос НЕ про Poco! Любая простая net библиотека
От: so5team https://stiffstream.com
Дата: 03.02.17 09:59
Оценка: +2
Здравствуйте, Мёртвый Даун, Вы писали:

МД>В результате у меня нигде нет доступа к объекту класса MyClientServiceHandler. Как мне положить в исходящий буфер?


Очевидно, выход у вас один: заплатить тому, кто понимает, что делает.
Re[10]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Мёртвый Даун Россия  
Дата: 03.02.17 10:22
Оценка:
Здравствуйте, so5team, Вы писали:

S>Очевидно, выход у вас один: заплатить тому, кто понимает, что делает.


Так мне то это не надо.
Выход еще проще, просто ничего не делать. Проект и так лохматых годов, еще постоит.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Вопрос НЕ про Poco! Любая простая net библиотека
От: lpd Черногория  
Дата: 03.02.17 10:33
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Почему везде избегают написание примера TCP клиента с использованием библиотеки? Почему везде только примеры сервера?

Никогда Poco не использовал, но вот первое, что нашлось: EchoClient.cpp:

class ConnectionHandler {
private:
Poco::Net::SocketAddress sa_;
Poco::Net::StreamSocket sock_;
Poco::Net::SocketStream stream_;
...
}

ConnectionHandler connectionHandler(host, port);
if (!connectionHandler.connect()) {
std::cerr << "Cannot connect to " << host << ":" << port << std::endl;
return 1;
}
...
if (!connectionHandler.sendBytes(utf8g.c_str(),strlen(utf8g.c_str()))) {
std::cout << "Disconnected. Exiting...\n" << std::endl;
return 1;
}
//get the echo back from the server as simple bytes:
char greekEcho[256];
if (!connectionHandler.getBytes(greekEcho, strlen(utf8g.c_str()))) {
std::cout << "Disconnected. Exiting...\n" << std::endl;
return 1;
}

У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 03.02.2017 10:40 lpd . Предыдущая версия .
Re[3]: Вопрос НЕ про Poco! Любая простая net библиотека
От: okman Беларусь https://searchinform.ru/
Дата: 04.02.17 10:30
Оценка: +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Здравствуйте, okman, Вы писали:


O>>Boost.Asio не рассматривается?


МД>Скорее всего нет.

МД>1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет?
МД>2) примеры непонятные, ничего дальше int main() { } нету (а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё! Задача стара как кал мамонта.

В такой постановке задачи я вообще не понимаю, зачем здесь нужны библиотеки.
Можно ведь на "голых" сокетах написать то, что требуется. Под Windows, например, это означает использование
таких функций, как WSASend, WSARecv, WaitForXxx, GetOverlappedResult, работу с буферами и т.п.
В принципе, ничего заумного.
Re[4]: Вопрос НЕ про Poco! Любая простая net библиотека
От: Слава  
Дата: 04.02.17 11:15
Оценка:
Здравствуйте, okman, Вы писали:

O>В такой постановке задачи я вообще не понимаю, зачем здесь нужны библиотеки.

O>Можно ведь на "голых" сокетах написать то, что требуется. Под Windows, например, это означает использование
O>таких функций, как WSASend, WSARecv, WaitForXxx, GetOverlappedResult, работу с буферами и т.п.
O>В принципе, ничего заумного.

А давайте посоветуем топикстартеру использовать I/O Completion Ports, без всяких Boost'ов. Ведь он хочет асинхронности, не так ли?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.