git-svn-id: svn://db.shs.com.ru/pip@240 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2016-08-24 13:15:09 +00:00
parent 77a48eb270
commit 537c2fcd37
4 changed files with 27 additions and 26 deletions

View File

@@ -29,6 +29,7 @@
#define _PIPEER_BROADCAST_PORT 13361 #define _PIPEER_BROADCAST_PORT 13361
#define _PIPEER_TRAFFIC_PORT_S 13400 #define _PIPEER_TRAFFIC_PORT_S 13400
#define _PIPEER_TRAFFIC_PORT_E 14000 #define _PIPEER_TRAFFIC_PORT_E 14000
#define _PIPEER_PING_TIMEOUT 5.0
PIPeer::PeerData::PeerData(const PIString & n): PIObject(n) { PIPeer::PeerData::PeerData(const PIString & n): PIObject(n) {
@@ -184,6 +185,8 @@ void PIPeer::timerEvent(void * data, int delim) {
switch (delim) { switch (delim) {
case 1: // every 1 s case 1: // every 1 s
syncPeers(); syncPeers();
piMSleep(100);
pingNeighbours();
break; break;
case 5: // every 5 s case 5: // every 5 s
checkNetwork(); checkNetwork();
@@ -354,6 +357,7 @@ PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
bool PIPeer::send(const PIString & to, const void * data, int size) { bool PIPeer::send(const PIString & to, const void * data, int size) {
PIByteArray ba(data, size); PIByteArray ba(data, size);
// piCoutObj << "send" << ba.size_s() << "bytes" << _PIPEER_MSG_SIZE;
if (ba.size_s() <= _PIPEER_MSG_SIZE) { if (ba.size_s() <= _PIPEER_MSG_SIZE) {
ba.insert(0, uchar(1)); ba.insert(0, uchar(1));
return sendInternal(to, ba); return sendInternal(to, ba);
@@ -364,7 +368,6 @@ bool PIPeer::send(const PIString & to, const void * data, int size) {
if (!dp) return false; if (!dp) return false;
return dp->_data->send(ba); return dp->_data->send(ba);
} }
//piCout << "[PIPeer] send" << size << "bytes ok";
return true; return true;
} }
@@ -378,8 +381,11 @@ bool PIPeer::sendInternal(const PIString & to, const PIByteArray & data) {
} }
PIByteArray ba; PIByteArray ba;
ba << int(4) << self_info.name << to << int(0) << data; ba << int(4) << self_info.name << to << int(0) << data;
//piCoutObj << "sendInternal to" << to << data.size_s() << int(data.front()); // piCoutObj << "sendInternal to" << to << data.size_s() << int(data.front());
if (!sendToNeighbour(dp, ba)) return false; if (!sendToNeighbour(dp, ba)) {
//piCoutObj << "send error";
return false;
}
return true; return true;
} }
@@ -406,19 +412,18 @@ bool PIPeer::dataRead(uchar * readed, int size) {
PIString from, to; PIString from, to;
ba >> type; ba >> type;
PIMutexLocker locker(eth_mutex); PIMutexLocker locker(eth_mutex);
//piCoutObj << "received data from" << from << "packet" << type;
if (type == 5) { // ping request if (type == 5) { // ping request
PIString addr; PIString addr;
PISystemTime time; PISystemTime time;
ba >> to >> from >> addr >> time; ba >> to >> from >> addr >> time;
//piCout << "ping request" << to << from << addr; // piCout << "ping request" << to << from << addr;
PIMutexLocker plocker(peers_mutex); PIMutexLocker plocker(peers_mutex);
if (from == self_info.name) { // send ping back if (from == self_info.name) { // send ping back
const PeerInfo * pi = getPeerByName(to); const PeerInfo * pi = getPeerByName(to);
if (pi) { if (pi) {
if (pi->isNeighbour()) { if (pi->isNeighbour()) {
sba << int(6) << to << from << addr << time; sba << int(6) << to << from << addr << time;
//piCout << " ping from" << from << addr << ", send back to" << pi->name; // piCout << " ping from" << from << addr << ", send back to" << pi->name;
send_mutex.lock(); send_mutex.lock();
piForeachC (PeerInfo::Address & a, pi->addresses) { piForeachC (PeerInfo::Address & a, pi->addresses) {
if (eth_send.send(a.address, sba)) if (eth_send.send(a.address, sba))
@@ -434,7 +439,7 @@ bool PIPeer::dataRead(uchar * readed, int size) {
PIString addr; PIString addr;
PISystemTime time, ptime, ctime = PISystemTime::current(true); PISystemTime time, ptime, ctime = PISystemTime::current(true);
ba >> to >> from >> addr >> time; ba >> to >> from >> addr >> time;
//piCout << "ping reply" << to << from << addr; // piCout << "ping reply" << to << from << addr;
PIMutexLocker plocker(peers_mutex); PIMutexLocker plocker(peers_mutex);
if (to == self_info.name) { // ping echo if (to == self_info.name) { // ping echo
piForeach (PeerInfo & p, peers) { piForeach (PeerInfo & p, peers) {
@@ -448,13 +453,14 @@ bool PIPeer::dataRead(uchar * readed, int size) {
a.wait_ping = false; a.wait_ping = false;
if (a.ping < 0) a.ping = ptime.toMilliseconds(); if (a.ping < 0) a.ping = ptime.toMilliseconds();
else a.ping = 0.6 * a.ping + 0.4 * ptime.toMilliseconds(); else a.ping = 0.6 * a.ping + 0.4 * ptime.toMilliseconds();
//piCout << " ping echo" << p.name << a.address << a.ping; // piCout << " ping echo" << p.name << a.address << a.ping;
return true; return true;
} }
} }
} }
return true; return true;
} }
// piCoutObj << "received data from" << from << "packet" << type;
if (type != 4) return true; if (type != 4) return true;
diag_d.received(size); diag_d.received(size);
ba >> from >> to >> cnt >> pba; ba >> from >> to >> cnt >> pba;
@@ -731,24 +737,25 @@ void PIPeer::sendPeerRemove(const PIString & peer) {
void PIPeer::pingNeighbours() { void PIPeer::pingNeighbours() {
PIMutexLocker ml(peers_mutex);
PIByteArray ba, sba; PIByteArray ba, sba;
ba << int(5) << self_info.name; ba << int(5) << self_info.name;
//piCout << "*** pingNeighbours" << peers.size() << "..."; // piCoutObj << "*** pingNeighbours" << peers.size() << "...";
piForeach (PeerInfo & p, peers) { piForeach (PeerInfo & p, peers) {
if (!p.isNeighbour()) continue; if (!p.isNeighbour()) continue;
//piCout << " ping neighbour" << p.name << p.ping(); //piCout << " ping neighbour" << p.name << p.ping();
send_mutex.lock(); send_mutex.lock();
piForeach (PeerInfo::Address & a, p.addresses) { piForeach (PeerInfo::Address & a, p.addresses) {
//piCout << " address" << a.address << a.wait_ping; // piCout << " address" << a.address << a.wait_ping;
if (a.wait_ping) { if (a.wait_ping) {
if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= 5.) if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= _PIPEER_PING_TIMEOUT)
continue; continue;
a.ping = -1.; a.ping = -1.;
} }
a.wait_ping = true; a.wait_ping = true;
sba = ba; sba = ba;
sba << p.name << a.address << PISystemTime::current(true); sba << p.name << a.address << PISystemTime::current(true);
//piCout << "ping" << p.name << a.address << a.last_ping; // piCout << "ping" << p.name << a.address << a.last_ping;
if (eth_send.send(a.address, sba)) if (eth_send.send(a.address, sba))
diag_s.sended(sba.size_s()); diag_s.sended(sba.size_s());
} }
@@ -797,7 +804,6 @@ void PIPeer::syncPeers() {
cp._data->setDist(cp.dist + 1); cp._data->setDist(cp.dist + 1);
cp.was_update = false; cp.was_update = false;
} }
pingNeighbours();
if (change) buildMap(); if (change) buildMap();
self_info.cnt++; self_info.cnt++;
self_info.time = PISystemTime::current(); self_info.time = PISystemTime::current();

View File

@@ -206,7 +206,7 @@ void Daemon::TileFileProgress::tileEvent(PIScreenTile * t, TileEvent e) {
Daemon::Daemon(): inited__(false), PIPeer(pisd_prefix + PISystemInfo::instance()->hostname + "_" + PIString(rand() % 100)), fm(this) { Daemon::Daemon(): inited__(false), PIPeer(pisd_prefix + PISystemInfo::instance()->hostname + "_" + PIString(rand() % 100)) {
// setName("Daemon"); // setName("Daemon");
dtimer.setName("__S__Daemon_timer"); dtimer.setName("__S__Daemon_timer");
mode = offset = cur = height = 0; mode = offset = cur = height = 0;
@@ -608,13 +608,14 @@ void Daemon::closeFileDialog(const PIString & p_name, bool ok) {
void Daemon::dataReceived(const PIString & from, const PIByteArray & data) { void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
//if (conn_name != from) return; //if (conn_name != from) return;
// piCout << "rec" << data.size();
if (data.size() < 4) return; if (data.size() < 4) return;
PIMutexLocker ml(remote_mutex); PIMutexLocker ml(remote_mutex);
PIByteArray ba(data), rba; PIByteArray ba(data), rba;
Remote * r = remotes.value(from); Remote * r = remotes.value(from);
PIString dir; PIString dir;
int type; ba >> type; int type; ba >> type;
//piCout << "rec from " << from << type << r; // piCout << "rec from " << from << type << r;
switch (type) { switch (type) {
case RequestHostInfo: case RequestHostInfo:
makeMyHostInfo(); makeMyHostInfo();
@@ -626,7 +627,7 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
r->dir_my.cd(dir); r->dir_my.cd(dir);
r->ft.setDirectory(r->dir_my); r->ft.setDirectory(r->dir_my);
//piCout << "store to" << r->dir_my.absolutePath(); //piCout << "store to" << r->dir_my.absolutePath();
piCout << "cd to" << r->dir_my.absolutePath(); piCoutObj << "cd to" << r->dir_my.absolutePath();
r->updateDir(); r->updateDir();
// sendDirToRemote(r); // sendDirToRemote(r);
break; break;
@@ -737,7 +738,6 @@ void Daemon::makeOtherHostInfo() {
void Daemon::requestChDir(const PIString & d) { void Daemon::requestChDir(const PIString & d) {
if (d.isEmpty()) return; if (d.isEmpty()) return;
Remote * r = remotes.value(conn_name, 0); Remote * r = remotes.value(conn_name, 0);
//piCout << "request chdir" << d << conn_name << r;
if (d.isEmpty()) return; if (d.isEmpty()) return;
if (!r) return; if (!r) return;
fm.remoteSaveDir(); fm.remoteSaveDir();
@@ -745,4 +745,6 @@ void Daemon::requestChDir(const PIString & d) {
PIByteArray ba; PIByteArray ba;
ba << int(RequestChangeDir) << d; ba << int(RequestChangeDir) << d;
send(conn_name, ba); send(conn_name, ba);
// bool ok = send(conn_name, ba);
// piCout << "request chdir" << d << conn_name << r << ok;
} }

View File

@@ -1,6 +1,5 @@
#include "file_manager.h" #include "file_manager.h"
#include "shared.h" #include "shared.h"
#include "daemon.h"
extern PIScreen screen; extern PIScreen screen;
@@ -225,10 +224,8 @@ void FileManager::TileDir::resizeEvent(int w, int h) {
FileManager::FileManager(Daemon * d) { FileManager::FileManager() {
setName("FileManager"); setName("FileManager");
del_commit = false;
daemon = d;
CONNECTU(&screen, keyPressed, this, keyEvent) CONNECTU(&screen, keyPressed, this, keyEvent)
//dir.setDir("/home/peri4/Documents"); //dir.setDir("/home/peri4/Documents");
TileSimple * tl; TileSimple * tl;

View File

@@ -4,12 +4,11 @@
#include "piscreentiles.h" #include "piscreentiles.h"
#include "pidir.h" #include "pidir.h"
class Daemon;
class FileManager: public PIObject { class FileManager: public PIObject {
PIOBJECT(FileManager) PIOBJECT(FileManager)
public: public:
FileManager(Daemon * d = 0); FileManager();
PIScreenTile * tile() const; PIScreenTile * tile() const;
PIScreenTile * localTile() const {return panels[0];} PIScreenTile * localTile() const {return panels[0];}
@@ -67,11 +66,8 @@ private:
EVENT1(tileKey, PIKbdListener::KeyEvent, key) EVENT1(tileKey, PIKbdListener::KeyEvent, key)
static void tileKey_s(void * fm, PIKbdListener::KeyEvent key) {((FileManager*)fm)->tileKey(key);} static void tileKey_s(void * fm, PIKbdListener::KeyEvent key) {((FileManager*)fm)->tileKey(key);}
bool del_commit;
TileDir * panels[2]; TileDir * panels[2];
Daemon * daemon;
PIScreenTile * tile_root; PIScreenTile * tile_root;
PIStringList selected;
typedef PIPair<PIString, PIString> SSPair; typedef PIPair<PIString, PIString> SSPair;
}; };