piethernet
git-svn-id: svn://db.shs.com.ru/pip@38 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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();}
|
||||
|
||||
@@ -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_;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();}}
|
||||
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user