m2.mbcp/src/highreceiver.cc

90 lines
2 KiB
C++
Raw Permalink Normal View History

2006-02-05 17:43:00 +00:00
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
2006-03-06 15:16:12 +00:00
#include "macros.h"
#include "highreceiver.h"
2006-03-06 15:29:19 +00:00
#include "message.h"
2006-03-06 15:16:12 +00:00
#define DEBUG 0
2006-03-06 12:42:03 +00:00
HighReceiver::HighReceiver(short low_port){
2006-02-05 17:43:00 +00:00
printf("LowReceiver::LowReceiver --");
2006-03-06 12:42:03 +00:00
_port = low_port + 1;
2006-02-05 17:43:00 +00:00
_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;
2006-03-06 12:42:03 +00:00
_socket_addr->sin_port = htons(_port);
2006-02-05 17:43:00 +00:00
_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);
}
2006-03-01 21:40:44 +00:00
}
short HighReceiver::getPort(){
return _port;
2006-02-05 17:43:00 +00:00
}
HighReceiver::~HighReceiver(){
delete _socket_addr;
}
2006-03-06 15:29:19 +00:00
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;
2006-02-05 17:43:00 +00:00
while(1){
2006-03-06 15:29:19 +00:00
// recevoir les donn<6E>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<6E>es en fonction du protocole...
2006-02-05 17:43:00 +00:00
}
}
2006-03-06 15:16:12 +00:00
#undef DEBUG