Здравствуйте, Мёртвый Даун, Вы писали:
МД>P.S. 21-ый век на дворе, но как оказалось нигде не найти примера нормального асинхронного TCP клиента. Жесть! Вообще разочарован.
Так и не запинал этот кусок дерьмища, непонятно как им пользоваться. Абсолютно не приспособленная библиотека для работы с сетью и с сокетами. Везде где можно рекомендовал чтобы никогда не пользовались этой библиотекой. Полное отсутствие примеров дальше чем хэлоу ворлд.
Если я там сделал socket.shutdownSend(), то на следующий socket.send() ошибка. А как возобновить передачу? Жесть.
Если сокеты блокирующие, то таймауты не работают. Если не блокирующие то вообще беда. Как там товарищ привел в пример, SocketReactor, так оно вообще всё наглухо вешает, ибо эти хэндлеры стреляют. Жесть.
Socket::receiveBytes() всегда ноль возвращает, типа graceful shutdown. Жесть!!!
Ну как этим дерьмом пользоваться то?
Про многопоточность вообще молчу, сокеты там даже и не работают.
Сейчас совсем нет никаких нормальных библиотек для работы с сокетами? Это же беда совсем. Я уже незнаю, хочу очень простого, но побольше чем хэлоу ворлд.
Почему везде избегают написание примера TCP клиента с использованием библиотеки? Почему везде только примеры сервера?
Жаль что Qt нельзя использовать в проекте, там всё это за 5 мин пишется.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Здравствуйте, Мёртвый Даун, Вы писали:
МД>>P.S. 21-ый век на дворе, но как оказалось нигде не найти примера нормального асинхронного TCP клиента. Жесть! Вообще разочарован.
МД>Псевдо:
Здравствуйте, okman, Вы писали:
O>Boost.Asio не рассматривается?
Скорее всего нет.
1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет?
2) примеры непонятные, ничего дальше int main() { } нету (а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё! Задача стара как кал мамонта. Мне нужно вписать всё в архитектуру лохматого проекта, в котором один идиот N лет назад заюзал дерьмо под названием Poco Library. У меня с Poco ничего не получается. Примеров нет. Ничего не работает.
3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Вопрос НЕ про Poco! Любая простая net библиотека
Здравствуйте, solano, Вы писали:
S>Здравствуйте, okman, Вы писали:
O>>Boost.Asio не рассматривается?
S>Поддерживаю. Отличный вариант. Есть и асинхронность. Есть и таймеры и возможность сделать таймауты для операций.
S>И за примерми далеко ходить не надо. Тыц.
Выделенное всё ненужно. Нужно просто отправить, принять!
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Вопрос НЕ про Poco! Любая простая net библиотека
Здравствуйте, Мёртвый Даун, Вы писали:
O>>Boost.Asio не рассматривается? МД>Скорее всего нет. МД>1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет?
boost asio существует уже не первый год, в течении всего периода существования на нем писалось большое кол-во промышленного кода.. это по моему уже говорит о многом.
ну и загуглил для Вас: Who is using Asio?
МД>2) примеры непонятные, ничего дальше int main() { } нету
даже в офиц доке куча рабочих примеров, и если читать и вникать, то уже понятно куда плясать дальше, но можно и смотреть здесь или здесь. Чтобы найти эти примеры нужно конечно больше времени, чем написать сообщение на рсдн-е, но это возможно)
МД>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё!
мдэ...
МД>Задача стара как кал мамонта. Мне нужно вписать всё в архитектуру лохматого проекта, в котором один идиот N лет назад заюзал дерьмо под названием Poco Library. У меня с МД>Poco ничего не получается. Примеров нет. Ничего не работает.
мне начинает казаться, что Poco Library не причем, может Вам лучше отдать код кому-то другому, может аутсорсинг.
МД>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.
Здравствуйте, 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 библиотека
Здравствуйте, Мёртвый Даун, Вы писали:
МД>>>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё! МД>Точняк. Оказывается для таких простых действий не нужны никакие таймеры, таймауты, дэдлайны, перформансы и прочее... МД>>>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.
Вы кого-то явно обманываете. Если нужно просто отправить и просто прочитать ответ, то вам как раз и подойдет синхронная работа с сокетами (см. в сторону прямого использования StreamSocket). Если же вам синхронная работа почему-то не нужна и вы хотите именно асинхронной, тогда в POCO прямая дорога к SocketReactor. Но тут уж без понимания EventHandler-ов, таймаутов, таймеров и прочее не обойтись.
R>>мне начинает казаться, что Poco Library не причем, может Вам лучше отдать код кому-то другому, может аутсорсинг.
МД>Да я бы с удовольствием вообще этим дерьмом не занимался.
PS. POCO хорошая библиотека, не такая продвинутая, как Asio или ACE, но зато простая как две копейки. Там по исходникам за пару часов можно разобраться что и как работает. Просто наймите кого-нибудь, кто умеет программировать. Ну или пусть на форуме вопросы задаст кто-то менее истеричный и более вменяемый.
Re: Вопрос НЕ про Poco! Любая простая net библиотека
МД>Если я там сделал socket.shutdownSend(), то на следующий socket.send() ошибка. А как возобновить передачу? Жесть.
POCO конечно не айс, но в чем проблема? Shutdown на сокете говорит о том, что всё — сокет закрывается. Соответственно, никакой send уже не будет на нем работать. Нужно другой сокет создавать. Это не POCO, это сокеты беркли так работают
Не буду говорить именно про 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 библиотека
Здравствуйте, so5team, Вы писали:
S>Здравствуйте, Мёртвый Даун, Вы писали:
МД>>>>(а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё! МД>>Точняк. Оказывается для таких простых действий не нужны никакие таймеры, таймауты, дэдлайны, перформансы и прочее... МД>>>>3) везде примеры только серверов, но нигде нет примера клиента, а если есть, то какое то идиотское а-ля Echo Client, причем синхронный.
S>Вы кого-то явно обманываете. Если нужно просто отправить и просто прочитать ответ, то вам как раз и подойдет синхронная работа с сокетами (см. в сторону прямого использования StreamSocket). Если же вам синхронная работа почему-то не нужна и вы хотите именно асинхронной, тогда в POCO прямая дорога к SocketReactor. Но тут уж без понимания EventHandler-ов, таймаутов, таймеров и прочее не обойтись.
Ну разумеется логика чуть сложнее чем я привел выше... поэтому синхронная работа не подходит...
SocketReactor и SocketConnector непонятно как ими пользоваться, полный отстой. Всё делается внутри, непонятно как через них чтото отправить и принять.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[7]: Вопрос НЕ про Poco! Любая простая net библиотека
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Ну разумеется логика чуть сложнее чем я привел выше... поэтому синхронная работа не подходит...
Ну так здесь кроме вас этой логики никто не знает, а вы не спешите ее внятно описать, что не облегчает задачу помочь вам.
МД>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 библиотека
Именно с этим я уже и разобрался... 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. Как мне положить в исходящий буфер?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>В результате у меня нигде нет доступа к объекту класса MyClientServiceHandler. Как мне положить в исходящий буфер?
Очевидно, выход у вас один: заплатить тому, кто понимает, что делает.
Re[10]: Вопрос НЕ про Poco! Любая простая net библиотека
Здравствуйте, so5team, Вы писали:
S>Очевидно, выход у вас один: заплатить тому, кто понимает, что делает.
Так мне то это не надо.
Выход еще проще, просто ничего не делать. Проект и так лохматых годов, еще постоит.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Вопрос НЕ про Poco! Любая простая net библиотека
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Почему везде избегают написание примера TCP клиента с использованием библиотеки? Почему везде только примеры сервера?
Никогда Poco не использовал, но вот первое, что нашлось: EchoClient.cpp:
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Здравствуйте, okman, Вы писали:
O>>Boost.Asio не рассматривается?
МД>Скорее всего нет. МД>1) слишком сложно, если что-то не так будет, кто потом с этим разбираться будет? МД>2) примеры непонятные, ничего дальше int main() { } нету (а мне надо в классец всё запихать), везде какие то таймеры. Мне не нужны никакие таймеры, таймауты и прочее. Мне нужно отправить массив байтов, и принять ответом. Всё! Задача стара как кал мамонта.
В такой постановке задачи я вообще не понимаю, зачем здесь нужны библиотеки.
Можно ведь на "голых" сокетах написать то, что требуется. Под Windows, например, это означает использование
таких функций, как WSASend, WSARecv, WaitForXxx, GetOverlappedResult, работу с буферами и т.п.
В принципе, ничего заумного.
Re[4]: Вопрос НЕ про Poco! Любая простая net библиотека
Здравствуйте, okman, Вы писали:
O>В такой постановке задачи я вообще не понимаю, зачем здесь нужны библиотеки. O>Можно ведь на "голых" сокетах написать то, что требуется. Под Windows, например, это означает использование O>таких функций, как WSASend, WSARecv, WaitForXxx, GetOverlappedResult, работу с буферами и т.п. O>В принципе, ничего заумного.
А давайте посоветуем топикстартеру использовать I/O Completion Ports, без всяких Boost'ов. Ведь он хочет асинхронности, не так ли?