#include #include #include #include #include #include "macros.h" #include "highreceiver.h" #include "message.h" #define DEBUG 0 HighReceiver::HighReceiver(short low_port){ printf("LowReceiver::LowReceiver --"); _port = low_port + 1; _socket_desc = socket(AF_INET, SOCK_DGRAM, 0); /* et l'autre variante : AF_UNIX */ if (_socket_desc < 0){ /* error */ perror("Creation de la socket impossible"); fprintf(stderr,"BOUM at %s:%d",__FILE__,__LINE__); // FIXME: throw something exit(-1); } struct sockaddr_in * _socket_addr = new sockaddr_in; // port_low = externe // port_high = interne bzero(_socket_addr,sizeof(sockaddr_in)); _socket_addr->sin_family = AF_INET; _socket_addr->sin_port = htons(_port); _socket_addr->sin_addr.s_addr = htonl(INADDR_ANY); // chopper une socket if (bind(_socket_desc,(struct sockaddr *)_socket_addr,sizeof(sockaddr_in)) < 0) { //FIXME : throw something perror("Attachement de la socket impossible"); fprintf(stderr,"BOUM at %s:%d",__FILE__,__LINE__); exit(-1); } } short HighReceiver::getPort(){ return _port; } HighReceiver::~HighReceiver(){ delete _socket_addr; } void HighReceiver::run() { int buffer_len = 1500; char * buffer = new char[buffer_len]; struct sockaddr_in repaddr; socklen_t sockaddr_len = sizeof(struct sockaddr_in); Message * mesg = NULL; while(1){ // recevoir les données memset(buffer, '\0', buffer_len); bzero(&repaddr,sizeof(struct sockaddr_in)); int read_buffer_len = recvfrom( _socket_desc, buffer, buffer_len, 0, (struct sockaddr*)&repaddr, &sockaddr_len); mesg = new Message(buffer, read_buffer_len); printf("HighReceiver::run -- READ size %d\n", read_buffer_len); char * str = new char[mesg->getDataSize() + 1]; strncpy(str, mesg->getData(), mesg->getDataSize()); str[mesg->getDataSize()] = '\0'; printf("HighReceiver::run -- READ '%s'\n", str); delete(mesg); mesg = NULL; // on dispatche les données en fonction du protocole... } } #undef DEBUG