From adfb47e82d35cd95f77c423b120eb07bf17eea3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 31 Mar 2015 11:23:05 +0000 Subject: [PATCH] State iconsferansfers fixnsfer git-svn-id: svn://db.shs.com.ru/pip@53 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- main.cpp | 5 +- src/io/pibasetransfer.cpp | 2 +- src/io/piethernet.h | 2 + src/io/pifiletransfer.cpp | 2 +- src/io/piiodevice.cpp | 1 + src/io/pipeer.cpp | 68 +++++++++++++++++++------- src/io/pipeer.h | 4 ++ utils/udp_file_transfer/main.cpp | 82 ++------------------------------ 8 files changed, 64 insertions(+), 102 deletions(-) diff --git a/main.cpp b/main.cpp index 8164de08..4010d4d8 100644 --- a/main.cpp +++ b/main.cpp @@ -135,10 +135,7 @@ public: //#include int main (int argc, char * argv[]) { - PIDir d; - piCout << d.path(); - d.setDir("C:/asd/fgh"); - piCout << d.path(); + piCout << PIDir::allEntries(argv[1]); return 0; /* hostent * he = 0; diff --git a/src/io/pibasetransfer.cpp b/src/io/pibasetransfer.cpp index 9ed3d919..28d9e0ee 100644 --- a/src/io/pibasetransfer.cpp +++ b/src/io/pibasetransfer.cpp @@ -146,7 +146,7 @@ bool PIBaseTransfer::send_process() { for (int i = 0; i < session.size_s(); i++) { if (send_queue >= packets_count) { --i; - piMSleep(10); + piMSleep(1); if (send_tm.elapsed_s() > timeout_) return finish_send(false); if (stm.elapsed_s() > timeout_ / 10.) send_queue = 0; diff --git a/src/io/piethernet.h b/src/io/piethernet.h index 38628859..6a8afaa0 100755 --- a/src/io/piethernet.h +++ b/src/io/piethernet.h @@ -422,5 +422,7 @@ private: }; inline bool operator <(const PIEthernet::Interface & v0, const PIEthernet::Interface & v1) {return (v0.name < v1.name);} +inline bool operator ==(const PIEthernet::Interface & v0, const PIEthernet::Interface & v1) {return (v0.name == v1.name && v0.address == v1.address && v0.netmask == v1.netmask);} +inline bool operator !=(const PIEthernet::Interface & v0, const PIEthernet::Interface & v1) {return (v0.name != v1.name || v0.address != v1.address || v0.netmask != v1.netmask);} #endif // PIETHERNET_H diff --git a/src/io/pifiletransfer.cpp b/src/io/pifiletransfer.cpp index 4c40a14d..c19ba0ed 100644 --- a/src/io/pifiletransfer.cpp +++ b/src/io/pifiletransfer.cpp @@ -47,7 +47,7 @@ bool PIFileTransfer::send(PIVector entries) { for (int i = 0; i < entries.size_s(); i++) { allEntries << entries[i]; if (entries[i].isDir()) - allEntries << PIDir::allEntries(dir.absolutePath() + dir.separator + entries[i].path); + allEntries << PIDir::allEntries(entries[i].path); } return sendFiles(allEntries); } diff --git a/src/io/piiodevice.cpp b/src/io/piiodevice.cpp index 0c1e8b8b..9675ac52 100755 --- a/src/io/piiodevice.cpp +++ b/src/io/piiodevice.cpp @@ -180,6 +180,7 @@ void PIIODevice::write_func() { void PIIODevice::terminate() { + timer.stop(); thread_started_ = false; if (!isInitialized()) return; if (isRunning()) { diff --git a/src/io/pipeer.cpp b/src/io/pipeer.cpp index 35ee5d2d..a282cab0 100755 --- a/src/io/pipeer.cpp +++ b/src/io/pipeer.cpp @@ -131,13 +131,11 @@ PIPeer::PIPeer(const PIString & name_): PIObject() { srand(uint(PISystemTime::current(true).toMicroseconds())); //id_ = self_info.name + "_" + PIString::fromNumber(rand()); CONNECTU(&timer, tickEvent, this, timerEvent); - PIStringList sl = PIEthernet::allAddresses(); - initEths(sl); - sl.removeAll("127.0.0.1"); - initMBcasts(sl); + initNetwork(); sendSelfInfo(); + prev_ifaces = PIEthernet::interfaces(); timer.addDelimiter(5); - timer.start(200); + timer.start(1000); } @@ -145,11 +143,7 @@ PIPeer::~PIPeer() { timer.stop(); diag_s.stop(); diag_d.stop(); - piForeach (PIEthernet * i, eths_traffic) { - i->stopThreadedRead(); - delete i; - } - eths_traffic.clear(); + destroyEths(); piForeach (PIEthernet * i, eths_mcast) i->stopThreadedRead(); piForeach (PIEthernet * i, eths_bcast) @@ -163,9 +157,12 @@ PIPeer::~PIPeer() { void PIPeer::timerEvent(void * data, int delim) { switch (delim) { - case 5: // 1 s + case 1: // every 1 s syncPeers(); break; + case 5: // every 5 s + checkNetwork(); + break; } //send("broadcast", 9); } @@ -260,14 +257,29 @@ void PIPeer::initMBcasts(PIStringList al) { } -void PIPeer::destroyMBcasts() { - piForeach (PIEthernet * i, eths_mcast) { - i->leaveMulticastGroup(_PIPEER_MULTICAST_IP); +void PIPeer::destroyEths() { + piForeach (PIEthernet * i, eths_traffic) { + i->stopThreadedRead(); + i->close(); delete i; } - piForeach (PIEthernet * i, eths_bcast) + eths_traffic.clear(); +} + + +void PIPeer::destroyMBcasts() { + piForeach (PIEthernet * i, eths_mcast) { + i->stopThreadedRead(); + i->leaveMulticastGroup(_PIPEER_MULTICAST_IP); + i->close(); delete i; - eth_lo.stop(); + } + piForeach (PIEthernet * i, eths_bcast) { + i->stopThreadedRead(); + i->close(); + delete i; + } + eth_lo.stopThreadedRead(); eth_lo.close(); eths_mcast.clear(); eths_bcast.clear(); @@ -335,7 +347,7 @@ void PIPeer::dtReceived(const PIString & from, const PIByteArray & data) { bool PIPeer::dataRead(uchar * readed, int size) { if (size < 16) return true; PIByteArray ba(readed, size), sba, pba; - int type, cnt, rec_size; + int type, cnt; PIString from, to; ba >> type; PIMutexLocker locker(eth_mutex); @@ -718,6 +730,28 @@ void PIPeer::syncPeers() { } +void PIPeer::checkNetwork() { + PIEthernet::InterfaceList ifaces = PIEthernet::interfaces(); + if (prev_ifaces == ifaces) return; + prev_ifaces = ifaces; + PIMutexLocker mbl(mc_mutex); + PIMutexLocker ethl(eth_mutex); + initNetwork(); +} + + +void PIPeer::initNetwork() { + destroyEths(); + destroyMBcasts(); + piCoutObj << "initNetwork"; + self_info.addresses.clear(); + PIStringList sl = PIEthernet::allAddresses(); + initEths(sl); + sl.removeAll("127.0.0.1"); + initMBcasts(sl); +} + + void PIPeer::buildMap() { //piCout << "[PIPeer \"" + name_ + "\"] buildMap"; peers_map.clear(); diff --git a/src/io/pipeer.h b/src/io/pipeer.h index 6eeaf760..d495392d 100755 --- a/src/io/pipeer.h +++ b/src/io/pipeer.h @@ -159,9 +159,12 @@ private: void sendSelfInfo() {sendPeerInfo(self_info);} void sendSelfRemove() {sendPeerRemove(self_info.name);} void syncPeers(); + void checkNetwork(); + void initNetwork(); void buildMap(); void initEths(PIStringList al); void initMBcasts(PIStringList al); + void destroyEths(); void destroyMBcasts(); void sendMBcast(const PIByteArray & ba); void pingNeighbours(); @@ -178,6 +181,7 @@ private: typedef PIPair > napair; PIVector eths_traffic, eths_mcast, eths_bcast; + PIEthernet::InterfaceList prev_ifaces; PIEthernet eth_send, eth_lo; PITimer timer; PIMutex mc_mutex, eth_mutex, peers_mutex; diff --git a/utils/udp_file_transfer/main.cpp b/utils/udp_file_transfer/main.cpp index 89e14467..bf6cdb52 100644 --- a/utils/udp_file_transfer/main.cpp +++ b/utils/udp_file_transfer/main.cpp @@ -2,77 +2,6 @@ #include "pifiletransfer.h" #include "pidatatransfer.h" -class Ob: public PIObject { - PIOBJECT(Ob) -public: - Ob() { - srand(PISystemTime::current().toMicroseconds()); - bytes_from = bytes_to = 0; - - sft.setName("sft"); - //sft.setDirectory(sft.directory().cd("..\\")); - //piCout << "Send File Transfer DIrectory" << sft.directory().absolutePath(); - CONNECTU(&sft, sendRequest, this, ssend); - - rft.setName("rft"); - //rft.setDirectory(rft.directory().cd("..\\1")); - //piCout << "Receive File Transfer DIrectory" << rft.directory().absolutePath(); - CONNECTU(&rft, sendRequest, this, rsend); - } - - void startsend() { -// PIDir dir = PIDir::current(); -// dir.cd("..\\"); -// piCout << dir.absolutePath(); -// PIVector des = dir.allEntries(); -// piCout << "all entries" << des.size(); -// PIFile::FileInfo sde; -// piForeachC(PIFile::FileInfo de, des) { -// piCout << (de.isDir() ? "dir:" : "file") << de.name << de.size; -// if (de.name() == "0") sde = de; -// } -// sft.setPacketSize(64096); -// sft.send(sde); - PIByteArray ba; - ba.resize(65536); - for (int i=0; i 80) {data.remove(data.size()/2, 1);} -// if(rand()%100 > 70) {data[data.size()-6] = 1;} -// if(rand()%100 < 90) - rft.received(data); - } - - EVENT_HANDLER1(void, rsend, PIByteArray &, data) { - bytes_from += data.size(); - piCout << "[receiver]" << rft.stateString() << ". datasize =" << data.size() - << "(" << PIString::readableSize(rft.bytesCur()) << "/" << PIString::readableSize(rft.bytesAll()) << ")" - << "(" << PIString::readableSize(bytes_to) << "/" << PIString::readableSize(bytes_from) << ")"; -// if(rand()%100 > 80) {data.remove(data.size()/2, 1);} -// if(rand()%100 > 70) {data[data.size()-6] = 1;} -// if(rand()%100 < 90) - sft.received(data); - } - - PIDataTransfer sft; - PIDataTransfer rft; - ullong bytes_to, bytes_from; -}; - class UDPFileTransfer: public PITimer { PIOBJECT_SUBCLASS(UDPFileTransfer, PITimer) @@ -122,14 +51,9 @@ private: }; int main (int argc, char * argv[]) { -// Ob o; -// PITimeMeasurer tm; -// o.startsend(); -// piCout << tm.elapsed_s(); -// return 0; if (!(argc == 3 || argc == 4)) { - piCout << "UDPFileTransfer"; - piCout << "USE: piptest [src_ip_port] [dst_ip_port] {filename}"; + piCout << "UDP File Transfer"; + piCout << "USE: pift src_ip:port dst_ip:port [filename]"; return 0; } PIKbdListener kbd; @@ -137,7 +61,7 @@ int main (int argc, char * argv[]) { PIString src = argv[1]; PIString dst = argv[2]; UDPFileTransfer f(src, dst); - piCout << "work directory" << f.ft.directory().absolutePath() << ", listen on" << src << ",send to" << dst; + piCout << "work directory" << f.ft.directory().absolutePath() << ", listen on" << src << ", send to" << dst; if (argc == 4) { PIString file = argv[3]; piCout << "send file" << file;