#include "pip.h" class Ob: public PIObject { PIOBJECT(Ob) public: Ob() { 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(); PIDir::DirEntry sde; piForeachC(PIDir::DirEntry de, des) { //piCout << (de.isDir() ? "dir:" : "file") << de.name << de.size; if (de.name == "0") sde = de; } //sft.setPacketSize(64096); sft.send(sde); } private: EVENT_HANDLER1(void, ssend, PIByteArray &, data) { // piCout << "[sender]" << sft.stateString() << ". datasize =" << data.size() // << "(" << PIString::readableSize(sft.bytesFileCur()) << "/" << PIString::readableSize(sft.bytesFileAll()) << ", " // << PIString::readableSize(sft.bytesTotalCur()) << "/" << PIString::readableSize(sft.bytesTotalAll()) << ")"; if(rand()%100 != 90) rft.received(data); } EVENT_HANDLER1(void, rsend, PIByteArray &, data) { // piCout << "[receiver]" << rft.stateString() << ". datasize =" << data.size() // << "(" << PIString::readableSize(rft.bytesFileCur()) << "/" << PIString::readableSize(rft.bytesFileAll()) << ", " // << PIString::readableSize(rft.bytesTotalCur()) << "/" << PIString::readableSize(rft.bytesTotalAll()) << ")"; if(rand()%100 != 90) sft.received(data); } PIFileTransfer sft; PIFileTransfer rft; }; 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, startSend, this, ftevent); CONNECTU(&ft, finishSend, this, ftevent); CONNECTU(&ft, startReceive, this, ftevent); CONNECTU(&ft, finishReceive, this, ftevent); CONNECTU(ð, threadedReadEvent, this, received); start(50); eth.open(); 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.bytesTotalCur()) << "/" << PIString::readableSize(ft.bytesTotalAll()) << ")"; } 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[]) { 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; // Ob o; // ft.setPacketSize(65536); // PITimeMeasurer tm; // o.startsend(); // piCout << tm.elapsed_s(); // return 0; }