Files
pip/main_tcp_server.cpp
Бычков Андрей 03100ecfc3 pip 0.4.2 alpha
git-svn-id: svn://db.shs.com.ru/pip@2 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
2015-02-28 13:03:22 +00:00

94 lines
2.2 KiB
C++

#include "pip.h"
class Client: public PIObject {
PIOBJECT(Client);
public:
Client(PIEthernet * eth_) {
eth = eth_;
eth->startThreadedRead();
CONNECTU(eth, threadedReadEvent, this, readed);
CONNECTU(eth, disconnected, this, disconnected);
piCoutObj << uint(eth) << "client connected";
}
~Client() {}
EVENT_HANDLER2(void, readed, uchar * , data, int, size) {
PIByteArray ba(data, size)
piCoutObj << uint(eth) << "readed" << size << "bytes" << Hex << ba;
eth->write(ba);
}
EVENT_HANDLER1(void, disconnected, bool, withError) {
piCoutObj << uint(eth) << "client disconnected";
disconnect(this);
}
void send() {
PIByteArray ba;
ba << uchar(0) << uchar(1) << uchar(2);
piCoutObj << uint(eth) << "client send" << ba;
eth->write(ba);
}
PIEthernet * eth;
EVENT1(disconnect, Client *, client)
};
class Server: public PIObject {
PIOBJECT(Server);
public:
Server(int port) {
eth = new PIEthernet(PIEthernet::TCP_Server);
eth->setParameter(PIEthernet::ReuseAddress);
CONNECTU(eth, newConnection, this, newConnection);
PIString path = "0.0.0.0:" + PIString::fromNumber(port);
eth->listen(path, true);
piCoutObj << uint(eth) << "server started" << path;
}
~Server() {
eth->close();
piCoutObj << uint(eth) << "server stoped";
delete eth;
}
EVENT_HANDLER1(void, newConnection, PIEthernet * , cl) {
piCoutObj << uint(eth) << "add client";
Client * client = new Client(cl);
CONNECTU(client, disconnect, this, disconnect);
clients.push_back(client);
}
EVENT_HANDLER1(void, disconnect, Client *, client) {
piCoutObj << uint(eth) << "remove client";
delete client;
clients.removeOne(client);
}
PIEthernet * eth;
PIVector<Client*> clients;
void send() {
for (int i=0; i<clients.size(); i++) {
clients[i]->send();
}
}
};
Server sl(10001);
Server s2(10002);
void keyEvent(char key, void*) {
switch (key) {
case '1': sl.send(); break;
case '2': s2.send(); break;
};
};
void timerEvent(void * , int) {
//sl.send();
};
PITimer timer(timerEvent);
int main(int argc, char * argv[]) {
timer.start(1000.);
PIKbdListener kbd(keyEvent);
kbd.enableExitCapture();
WAIT_FOR_EXIT;
return 0;
}