/** * @file Peer.cpp * * Created on: 17.01.2017 * @author Piotr Dergun */ #include "Peer.h" Peer::Peer() { this->partId = 1; this->srcPort = 0; this->remotePort = 0; this->sender = false; this->sim = NULL; } Peer::Peer(string hostname, string ip, string mask, string gatewayIp) : Node(hostname, ip, mask, gatewayIp) { this->partId = 1; this->srcPort = 0; this->remotePort = 0; this->sender = false; this->sim = NULL; } void Peer::onRecv() { stringstream ss; while (true) { ss.str(""); Packet p = this->recv(); if (p.getSrcPort() != 0) { // jezeli informacje o drugiej stronie if (this->isSender() && this->remotePort == 0) { vector x = split(p.getMsg(), ':'); this->remoteIp = x[1]; this->remotePort = atoi(x[2].c_str()); ss << "onRecv() REMOTE peer is " << this->remoteIp << ":" << this->remotePort; this->print(ss.str()); sleep(1); this->sendData(); } else if (!this->isSender() && p.getMsg().find("data") != string::npos) { ss << "onRecv() Received \"" << p.getMsg() << "\" from " << p.getSrcIp() << ":" << p.getSrcPort(); this->print(ss.str()); sleep(1); this->sendAck(p.getSrcIp(), p.getSrcPort()); } else if (this->isSender() && p.getMsg().find("Ack") != string::npos) { ss << "onRecv() Received \"" << p.getMsg() << "\" from " << p.getSrcIp() << ":" << p.getSrcPort(); this->print(ss.str()); sleep(1); this->sendData(); } } else { #ifndef DEBUG this->print("onRecv() sleeping..."); #endif } sleep(1); } } void Peer::connectToServer(string serverIp, int serverPort) { stringstream ss; ss << "Connecting to " << serverIp << ":" << serverPort; Packet p; if (this->isSender()) p.setMsg("getRemoteIPPort"); else p.setMsg("helloDownload"); p.setDstIp(serverIp); p.setDstPort(serverPort); this->srcPort = this->send(p); ss << "\t RESULT: " << this->srcPort; this->print(ss.str()); } void Peer::sendData() { stringstream ss; Packet p; ss << "data-Part" << this->partId++; p.setDstIp(this->remoteIp); p.setDstPort(this->remotePort); p.setSrcPort(this->srcPort); p.setMsg(ss.str()); ss.str(""); if (this->sim) this->sim->print("Sending a data to peer"); ss << "Sending \"" << p.getMsg() << "\" to " << p.getDstIp() << ":" << p.getDstPort(); this->print(ss.str()); this->send(p); } bool Peer::isSender() const { return sender; } void Peer::setSender(bool sender) { this->sender = sender; } void Peer::sendAck(string dstIp, int dstPort) { stringstream ss; Packet p; ss << "data-Ack" << this->partId++; p.setDstIp(dstIp); p.setDstPort(dstPort); p.setSrcPort(this->srcPort); p.setMsg(ss.str()); ss.str(""); if (this->sim) this->sim->print("Sending an acknowledgement to seed"); ss << "Sending \"" << p.getMsg() << "\" to " << p.getDstIp() << ":" << p.getDstPort(); this->print(ss.str()); this->send(p); } const Simulation* Peer::getSim() { return sim; } void Peer::setSim(Simulation* sim) { this->sim = sim; }