Symulacja NAT na przedmiot Symulacje Komputerowe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

150 lines
2.9 KiB

/**
* @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<string> 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;
}