piethernet

git-svn-id: svn://db.shs.com.ru/pip@38 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
2015-03-20 14:05:31 +00:00
parent 94b4870d94
commit f89764d6bc
20 changed files with 283 additions and 42 deletions

View File

@@ -4,9 +4,9 @@
#include "picrc.h"
#include "pitimer.h"
class PIBaseTransfer : public PIObject
class PIBaseTransfer: public PIObject
{
PIOBJECT(PIBaseTransfer)
PIOBJECT_SUBCLASS(PIBaseTransfer, PIObject)
public:
PIBaseTransfer();
~PIBaseTransfer();

View File

@@ -30,7 +30,7 @@ class PIConfig;
class PIP_EXPORT PIConnection: public PIObject
{
PIOBJECT(PIConnection)
PIOBJECT_SUBCLASS(PIConnection, PIObject)
public:
//! Constructs an empty connection
@@ -373,7 +373,7 @@ private:
};
class Sender: public PITimer {
PIOBJECT(Sender)
PIOBJECT_SUBCLASS(Sender, PIObject)
public:
Sender(PIConnection * parent_ = 0): parent(parent_), int_(0.f) {needLockRun(true);}
~Sender() {stop();}

View File

@@ -3,7 +3,7 @@
#include "pibasetransfer.h"
class PIDataTransfer : public PIBaseTransfer
class PIDataTransfer: public PIBaseTransfer
{
PIOBJECT_SUBCLASS(PIDataTransfer, PIBaseTransfer)
public:
@@ -11,12 +11,13 @@ public:
~PIDataTransfer() {;}
bool send(const PIByteArray &ba);
const PIByteArray &data() {return data_;}
const PIByteArray & data() {return data_;}
private:
virtual PIByteArray buildPacket(Part p);
virtual void receivePart(PIBaseTransfer::Part fi, PIByteArray ba, PIByteArray pheader);
virtual PIByteArray buildPacket(Part p);
virtual void receivePart(PIBaseTransfer::Part fi, PIByteArray ba, PIByteArray pheader);
PIByteArray data_;
};

View File

@@ -613,6 +613,14 @@ int PIEthernet::write(const void * data, int max_size) {
return -1;
}
void PIEthernet::clientDeleted() {
clients_mutex.lock();
clients_.removeOne((PIEthernet*)emitter());
clients_mutex.unlock();
}
void PIEthernet::server_func(void * eth) {
PIEthernet * ce = (PIEthernet * )eth;
if (ce->listen_threaded) {
@@ -628,14 +636,27 @@ void PIEthernet::server_func(void * eth) {
socklen_t slen = sizeof(client_addr);
int s = accept(ce->sock, (sockaddr * )&client_addr, &slen);
if (s == -1) {
int lerr = ethErrorCore();
#ifdef WINDOWS
if (lerr == WSAETIMEDOUT) {
#else
if (lerr == EAGAIN) {
#endif
piMSleep(10);
return;
}
if (ce->debug()) piCout << "[PIEthernet] Can`t accept new connection, " << ethErrorString();
piMSleep(10);
return;
}
PIString ip(inet_ntoa(client_addr.sin_addr));
ip += ":" + PIString::fromNumber(htons(client_addr.sin_port));
ce->clients_ << new PIEthernet(s, ip);
ce->newConnection(ce->clients_.back());
PIEthernet * e = new PIEthernet(s, ip);
ce->clients_mutex.lock();
CONNECTU(e, deleted, ce, clientDeleted)
ce->clients_ << e;
ce->clients_mutex.unlock();
ce->newConnection(e);
//cout << "connected " << ip << endl;
//char d[256];
//cout << " recv " << recv(s, d, 256, 0) << endl;

View File

@@ -396,11 +396,13 @@ protected:
bool connected_, connecting_, listen_threaded, server_bounded;
mutable PIString ip_, ip_s, ip_c, ip_r;
PIThread server_thread_;
PIMutex clients_mutex;
PIVector<PIEthernet * > clients_;
PIQueue<PIString> mcast_queue;
PIStringList mcast_groups;
private:
EVENT_HANDLER(void, clientDeleted);
static void server_func(void * eth);
void setType(Type t, bool reopen = true) {setProperty("type", (int)t); if (reopen && isOpened()) {closeDevice(); init(); openDevice();}}

View File

@@ -28,7 +28,7 @@
class PIP_EXPORT PIPeer: public PIObject
{
PIOBJECT(PIPeer)
PIOBJECT_SUBCLASS(PIPeer, PIObject)
private:
struct PeerData {
PeerData() {msg_count = msg_rec = 0;}

View File

@@ -35,7 +35,7 @@ class PIProtocol;
class PIP_EXPORT PIMultiProtocolBase: protected PIObject
{
PIOBJECT(PIMultiProtocolBase)
PIOBJECT_SUBCLASS(PIMultiProtocolBase, PIObject)
friend class PIProtocol;
public:
PIMultiProtocolBase() {;}
@@ -72,7 +72,7 @@ typedef void (*ReceiveFunc)(void * );
/// void send(const void * data, int size, bool direct = false)
class PIP_EXPORT PIProtocol: public PIObject
{
PIOBJECT(PIProtocol)
PIOBJECT_SUBCLASS(PIProtocol, PIObject)
friend class PIMultiProtocolBase;
friend class PIMultiProtocol;
enum Type {None, Serial, Ethernet};