From 6e48eaad66126f83480729a38dca1897f2066c11 Mon Sep 17 00:00:00 2001 From: haller Date: Sat, 3 Dec 2005 17:21:26 +0000 Subject: * Ajout de autoheader dans le autogen * Splittage de Socket --- i/simulotron/src/socket/socket_client.cc | 86 ++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 i/simulotron/src/socket/socket_client.cc (limited to 'i/simulotron/src/socket/socket_client.cc') diff --git a/i/simulotron/src/socket/socket_client.cc b/i/simulotron/src/socket/socket_client.cc new file mode 100644 index 0000000..3b7b05b --- /dev/null +++ b/i/simulotron/src/socket/socket_client.cc @@ -0,0 +1,86 @@ +#include "socket/socket_client.hh" +#include "socket/socket_server.hh" +#include "socket/address.hh" +#include "utils/errno_exception.hh" + +#include +#include + +SocketClient::SocketClient(const Address & address) +{ + // Crée le file descriptor du socket + socket_ = socket (PF_INET, SOCK_STREAM, 0); + if(socket_ < 0) + throw errno_exception ("La chaussette n'a pas pu être tricoté", errno); + + // On bind le socket + if(::bind (socket_, address.getSockaddr(), sizeof(*address.getSockaddr())) < 0) + throw errno_exception("Impossible d'assigner la chausette", errno); +} + +SocketClient::SocketClient(SocketServer & socketServer) +{ + socket_ = socketServer.accept(); + if (socket_ < 0) + throw errno_exception("Problème lors de la construction d'une chaussette cliente par accept", errno); +} + +SocketClient::~SocketClient(void) +{ + if(socket_ >= 0) + ::close(socket_); +} + +void SocketClient::connect(const Address & address) +{ + if (::connect (socket_, address.getSockaddr(), sizeof(sockaddr_in)) < 0) + throw errno_exception("Impossible de mettre la chaussette", errno); +} + +std::string SocketClient::read(void) +{ + std::string str; + int charReaded; + char buffer[BUFFER_SIZE]; + do + { + charReaded = ::read(socket_, buffer, BUFFER_SIZE - 1); + if(charReaded < 0) + throw errno_exception("SocketClient: problème de lecture", errno); + buffer[charReaded] = 0; + str += buffer; + }while(charReaded == BUFFER_SIZE - 1); + return str; +} + +void SocketClient::write(const std::string & str) +{ + char buffer[BUFFER_SIZE]; + unsigned int pos = 0; + int retval = 0; + + while(str.size() != pos) + { + int size = str.size() - pos < BUFFER_SIZE - 1 ? str.size() - pos:BUFFER_SIZE - 1; + str.copy(buffer, size, pos); + pos += size; + buffer[size] = 0; + retval = ::write(socket_, buffer, size); + if(retval < 0) + throw errno_exception("SocketClient: erreur d'écriture (write()) ", errno); + } +} + +char SocketClient::getChar(void) +{ + char getted; + if(::read(socket_, &getted, 1) < 0) + throw errno_exception("SocketClient: erreur d'écriture (write()) ", errno); + return getted; +} + +void SocketClient::putChar(char c) +{ + if(::write(socket_, &c, 1) < 0) + throw errno_exception("SocketClient: erreur d'écriture (write()) ", errno); +} -- cgit v1.2.3