1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include <iostream>
#include <cmath>
#include <vector>
#include <complex>
#include <string>
#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/DatagramSocket.h"
int main(void) {
// Creation des variables
int transmitterNumberPort = 100;
int receiverNumberPort = 102;
int nbData = 9.14*std::pow(10,2)*16;
int tailleBuffer = std::pow(2,10); // Mettre une puissance de 2 (maximum : 2^15)
bool remainingData = true;
int cptBuffer = 0;
int cptData = 0;
int dataLost = 0;
double pourcentageDataLost;
// Creation des donnees a recevoir
std::vector< std::complex<double> > data(nbData);
// Creation des donnees serialisees a recevoir
std::string serializedData = "";
// Creation des donnees qu'on devrait recevoir
std::vector< std::complex<double> > dataShouldBeReceived(nbData);
for(int n=0; n<nbData; n++)
dataShouldBeReceived[n] = std::complex<double>((double)(n % (int)std::pow(2,18)), 1.0);
try {
// Definition des emplacements d'envoi et de reception des donnees
Poco::Net::SocketAddress transmitterAddress("localhost", transmitterNumberPort);
Poco::Net::SocketAddress receiverAddress("localhost", receiverNumberPort);
// Creation du socket UDP
Poco::Net::DatagramSocket UDPSocket(receiverAddress,false);
// Creation des buffers
char buffer[tailleBuffer+1];
/** Reception des donnees **/
std::cout << "-- Reception des donnees --" << std::endl;
// Le PC de reception est sur ecoute tant que tous les paquets ne sont pas arrives.
while(remainingData) {
// Recuperation des buffers envoyes par l'emetteur specifie
UDPSocket.receiveFrom(buffer, tailleBuffer, transmitterAddress);
// Ajout de '/0' a la fin de chaque buffer (marqueur de fin des chaines de caracteres)
buffer[tailleBuffer] = '\0';
// Arret de l'ecoute si toutes les donnees sont arrivees
for(int i=0; i<tailleBuffer; i++) {
if(buffer[i] == 'F') {
buffer[i] = '\0';
remainingData = false;
break;
}
}
// Stockage des donnees serialisees
serializedData += buffer;
// Incrementation du nombre de buffers
cptBuffer++;
}
// Creation du pointeur sur les donnees serialisees
char* pSerializedData = &serializedData[0];
// Deserialisation des donnees (string => vector<complex<double>>)
std::string::size_type sz;
while(cptData != nbData) {
// Recuperation des parties reelle et imaginaire
double partieReelle = std::stod(pSerializedData,&sz);
pSerializedData += sz;
double partieImaginaire = std::stod(pSerializedData,&sz);
// Remplissage du vecteur de donnees
data[cptData] = std::complex<double>(partieReelle, partieImaginaire);
// Passage au prochain element
pSerializedData += sz;
// Incrementation du nombre de donnees
cptData++;
}
// Verification du fonctionnement du programme
for(int i=nbData-11;i<nbData;i++)
std::cout << "data[" << i <<"] = " << data[i] << std::endl;
}
catch(const Poco::Exception& e) {
std::cerr << e.displayText() << std::endl;
}
/** Calcul du pourcentage de donnees perdues **/
for(int n=0; n<nbData; n++) {
if(data[n] != dataShouldBeReceived[n])
dataLost++;
}
pourcentageDataLost = ((double)dataLost/(double)nbData)*100.0;
std::cout << "Pourcentage de donnees perdues = " << pourcentageDataLost << " %" << std::endl;
return 0;
} |
Partager