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
|
#include "TCPSocket.h"
#include <stdexcept>
#include <sstream>
TCPSocket::TCPSocket()
{
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mSocket == -1)
{
std::ostringstream error;
error << "Erreur initialisation socket [" << errno << "]";
throw std::runtime_error(error.str());
}
}
TCPSocket::~TCPSocket()
{
close(mSocket);
}
bool TCPSocket::Connect(const std::string& ipaddress, unsigned short port)
{
sockaddr_in server;
server.sin_addr.s_addr = inet_addr(ipaddress.c_str());
server.sin_family = AF_INET;
server.sin_port = htons(port);
return connect(mSocket,(const sockaddr*) &server, sizeof(server)) == 0;
}
bool TCPSocket::Send(const unsigned char* data, unsigned short len)
{
//Unsigned short pour la taille limite d'un paquet de 64ko
//Taille du paquet envoyé converti en homt to network short
unsigned short networkLen = htons(len);
//Suivant le protocole, on envoie un paquet avec la taille du data
//Deuxième envoi avec les données
//Send renvoie le nombre de données réellement envoyé, si les deux paquets sont bien partis return 1
return send(mSocket, reinterpret_cast<const char*>(& networkLen), sizeof(networkLen), 0) == sizeof(networkLen)
&& send(mSocket, reinterpret_cast<const char*>(data), len, 0) == len;
}
bool TCPSocket::Receive(std::vector<unsigned char>& buffer)
{
//Avec le protocole, on vide le buffer de la taille short pour connaitre la taille du paquet envoyé
unsigned short expectedSize;
int pending = recv(mSocket, reinterpret_cast<char*>(&expectedSize), sizeof(expectedSize), 0);
//Si jamais on a lu plus que la taille d'un short (comment possible) ou si buffer vide
if ( pending <= 0 || pending != sizeof(unsigned short) )
{
//!< Erreur
return false;
}
//Maintenant on connait la taille de données du paquet à récupérer dans le buffer
expectedSize = ntohs(expectedSize);
buffer.resize(expectedSize);
int receivedSize = 0;
//Maintenant on vide le buffer tant que l'on n'a pas reçu la taille suffisante
do {
int ret = recv(mSocket, reinterpret_cast<char*>(&buffer[receivedSize]), (expectedSize - receivedSize) * sizeof(unsigned char), 0);
if ( ret <= 0 )
{
//!< Erreur
buffer.clear();
return false;
}
else
{
receivedSize += ret;
}
} while ( receivedSize < expectedSize );
return true;
//return recv(mSocket, buffer, len, 0);
} |