#include #include #include #include "socket/socket.hh" #include "utils/errno_exception.hh" #include "socket/address.hh" Socket::Socket(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); } Socket::Socket(int socket) { socket_ = socket; } Socket::~Socket(void) { // XXX Pas faisable car les copy détruise les socket //close(socket_); } void Socket::connect(const Address & address) { if (::connect (socket_, address.getSockaddr(), sizeof(sockaddr_in)) < 0) throw errno_exception("Impossible de mettre la chaussette", errno); } void Socket::listen(int maxQueue) { if(::listen(socket_, maxQueue) < 0 ) throw errno_exception("Impossible d'écouter la mer dans la chaussette", errno); } Socket Socket::accept(Address & address) { sockaddr addr; socklen_t length = sizeof(sockaddr_in); int socket = ::accept(socket_, &addr, &length); if (socket < 0) throw errno_exception("Chaussette bloqué à la douane", errno); address = Address(&addr, length); return Socket(socket); } void Socket::close(void) { ::close(socket_); } std::string Socket::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("Socket: problème de lecture", errno); buffer[charReaded] = 0; str += buffer; }while(charReaded == BUFFER_SIZE - 1); return str; } void Socket::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("Socket: erreur d'écriture (write()) ", errno); } } char Socket::getChar(void) { char getted; ::read(socket_, &getted, 1); return getted; } void Socket::putChar(char c) { ::write(socket_, &c, 1); }