Многопоточный TCP-сервер с библиотеками POCO C ++

Я пытаюсь разработать TCP-сервер с библиотеками POCO C ++.
Я нашел несколько примеров Вот.
Сначала я попробовал пример от Алекса, но событие выключения не сработало. У EchoServer такая же проблема.
Итак, я попробовал пример Cesar Ortiz и получил необычную проблему. Через некоторое время сервер выдает ошибку:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
["src/ErrorHandler.cpp", line 60]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

И соединения получили ошибку тайм-аута подключения, а также новые подключения.
Пример с обработчиком событий semeed более корректен, но я не знаю, как исправить событие shutdown.

5

Решение

Если вам нужен только многопоточный TCP-сервер, то «из коробки» Poco :: Net :: TCPServer сделаем — он многопоточный внутри.
Начните с определения соединения, оно будет просто возвращать то, что вы ему отправляете:

class EchoConnection: public TCPServerConnection {
public:
EchoConnection(const StreamSocket& s): TCPServerConnection(s) { }

void run() {
StreamSocket& ss = socket();
try {
char buffer[256];
int n = ss.receiveBytes(buffer, sizeof(buffer));
while (n > 0) {
ss.sendBytes(buffer, n);
n = ss.receiveBytes(buffer, sizeof(buffer));
}
}
catch (Poco::Exception& exc)
{ std::cerr << "EchoConnection: " << exc.displayText() << std::endl; }
}
};

Затем запустите сервер и отправьте ему некоторые данные:

TCPServer srv(new TCPServerConnectionFactoryImpl<EchoConnection>());
srv.start();

SocketAddress sa("localhost", srv.socket().address().port());
StreamSocket ss(sa);
std::string data("hello, world");
ss.sendBytes(data.data(), (int) data.size());
char buffer[256] = {0};
int n = ss.receiveBytes(buffer, sizeof(buffer));
std::cout << std::string(buffer, n) << std::endl;

srv.stop();
12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]