#include "pip.h" #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) public: UDPFileTransfer(const PIString &src_ip_port, const PIString &dst_ip_port) { eth.setReadAddress(src_ip_port); eth.setSendAddress(dst_ip_port); //ft.setPacketSize(65000); CONNECTU(&ft, sendRequest, this, ftsend); CONNECTU(&ft, sendFilesStarted, this, ftevent); CONNECTU(&ft, receiveFilesStarted, this, ftevent); CONNECTU(&ft, sendFilesFinished, this, ftevent); CONNECTU(&ft, receiveFilesFinished, this, ftevent); CONNECTU(ð, threadedReadEvent, this, received); start(50); eth.setParameter(PIEthernet::SeparateSockets); eth.startThreadedRead(); } void startSend(const PIString &file) { ft.send(file); } PIFileTransfer ft; private: PIEthernet eth; void tick(void *, int) { if (ft.isSending() || ft.isReceiving()) ftevent(); } EVENT_HANDLER(void, ftevent) { piCout << ft.stateString() << "(" << PIString::readableSize(ft.bytesFileCur()) << "/" << PIString::readableSize(ft.bytesFileAll()) << ", " << PIString::readableSize(ft.bytesCur()) << "/" << PIString::readableSize(ft.bytesAll()) << ")"; } EVENT_HANDLER1(void, ftsend, PIByteArray &, data) { eth.send(data); } EVENT_HANDLER2(void, received, uchar * , readed, int, size) { PIByteArray ba(readed, size); ft.received(ba); } }; 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}"; return 0; } PIKbdListener kbd; kbd.enableExitCapture(); 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; if (argc == 4) { PIString file = argv[3]; piCout << "send file" << file; f.startSend(file); return 0; } else { piCout << "wait for receiving"; } WAIT_FOR_EXIT return 0; }