in almost all methods removed timeouts in milliseconds, replaced to PISystemTime PITimer rewrite, remove internal impl, now only thread implementation, API similar to PIThread PITimer API no longer pass void* PIPeer, PIConnection improved stability on reinit and exit PISystemTime new methods pisd now exit without hanging
77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
#include "piliterals_time.h"
|
|
#include "pip.h"
|
|
|
|
int main(int argc, char * argv[]) {
|
|
PIByteArray rnd;
|
|
rnd.resize(1024 * 1024, 'x');
|
|
PICLI cli(argc, argv);
|
|
PITimer tm;
|
|
cli.addArgument("connect", true);
|
|
cli.addArgument("name", true);
|
|
PICloudClient c("127.0.0.1:10101");
|
|
// c.setReopenEnabled(true);
|
|
PICloudServer s("127.0.0.1:10101");
|
|
auto clients = new PIVector<PICloudServer::Client *>();
|
|
CONNECTL(&tm, tickEvent, ([&](int) {
|
|
if (c.isConnected()) {
|
|
PIString str = "ping";
|
|
piCout << "[Client] send:" << str;
|
|
c.write(str.toByteArray());
|
|
}
|
|
if (s.isThreadedRead()) {
|
|
for (auto cl: *clients) {
|
|
if (cl->isOpened()) {
|
|
PIString str = "ping_S";
|
|
piCout << "[Server] send to" << cl << ":" << str;
|
|
cl->write(str.toByteArray());
|
|
}
|
|
}
|
|
}
|
|
}));
|
|
CONNECTL(&c, threadedReadEvent, ([&](const uchar * readed, ssize_t size) {
|
|
PIByteArray ba(readed, size);
|
|
if (size < 1024) {
|
|
PIString str = PIString::fromUTF8(ba);
|
|
piCout << "[Client] data:" << str;
|
|
if (str == "ping_S") c.write(PIString("pong_S").toByteArray());
|
|
} else
|
|
piCout << "[Client] blob:" << size;
|
|
}));
|
|
CONNECTL(&c, connected, ([]() { piCout << "connected"; }));
|
|
CONNECTL(&c, disconnected, ([]() { piCout << "disconnected"; }));
|
|
CONNECTL(&s, newConnection, ([&](PICloudServer::Client * cl) {
|
|
piCout << "[Server] new client:" << cl;
|
|
clients->append(cl);
|
|
CONNECTL(cl, threadedReadEvent, ([cl, &rnd](const uchar * readed, ssize_t size) {
|
|
PIByteArray ba(readed, size);
|
|
PIString str = PIString::fromUTF8(ba);
|
|
piCout << "[Server] data from" << cl << ":" << str;
|
|
if (str == "ping") {
|
|
cl->write(PIString("pong").toByteArray());
|
|
cl->write(rnd);
|
|
}
|
|
}));
|
|
CONNECTL(cl, closed, ([&clients, cl]() {
|
|
piCout << "[Server] client closed ..." << cl;
|
|
cl->stop();
|
|
clients->removeAll(cl);
|
|
piCout << "[Server] client closed ok" << cl;
|
|
// cl->deleteLater();
|
|
}));
|
|
cl->startThreadedRead();
|
|
}));
|
|
if (cli.hasArgument("name")) s.setServerName(cli.argumentValue("name"));
|
|
if (cli.hasArgument("connect")) {
|
|
c.setServerName(cli.argumentValue("connect"));
|
|
c.startThreadedRead();
|
|
} else {
|
|
s.startThreadedRead();
|
|
}
|
|
tm.start(1_Hz);
|
|
PIKbdListener ls;
|
|
ls.enableExitCapture(PIKbdListener::F10);
|
|
ls.start();
|
|
WAIT_FOR_EXIT
|
|
return 0;
|
|
}
|