114 lines
2.5 KiB
C++
114 lines
2.5 KiB
C++
|
|
#include "group.h"
|
|
|
|
#include <iostream>
|
|
|
|
#define DEBUG 0
|
|
|
|
Group::Group(std::list<HostId> group){
|
|
_hosts = group;
|
|
_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 * myaddr = new sockaddr_in;
|
|
|
|
bzero(myaddr,sizeof(sockaddr_in));
|
|
myaddr->sin_family = AF_INET;
|
|
myaddr->sin_port = htons(0);
|
|
myaddr->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
if (bind(_socket_desc,(struct sockaddr *)myaddr,sizeof(sockaddr_in)) < 0) {
|
|
//FIXME : throw something
|
|
perror("Attachement de la socket impossible");
|
|
fprintf(stderr,"BOUM at %s:%d",__FILE__,__LINE__);
|
|
exit(-1);
|
|
}
|
|
|
|
//FIXME: définir une liste avec les structures...
|
|
std::list<HostId>::iterator hiIter;
|
|
for (hiIter = _hosts.begin();
|
|
hiIter != _hosts.end();
|
|
hiIter++){
|
|
// pour chacun des hostId, on ouvre une socket
|
|
HostId &hid = *hiIter;
|
|
std::cout << "HOST: " <<hid.host <<std::endl;
|
|
//printf("HOST: %s\n",hid.host.c_str());
|
|
|
|
/* structure hostent qui sera remplie par gethostbyname */
|
|
struct hostent * hp;
|
|
struct sockaddr_in * addr = new sockaddr_in;
|
|
int addr_len = sizeof(struct sockaddr_in);
|
|
|
|
/* Recuperer l'adresse IP du serveur */
|
|
if((hp = gethostbyname(hid.host.c_str())) == NULL) {
|
|
fprintf(stderr,
|
|
"Erreur client : echec gethostbyname sur %s\n",
|
|
hid.host.c_str()) ;
|
|
//FIXME: throw something
|
|
exit(-1);
|
|
}
|
|
|
|
addr->sin_family = AF_INET;
|
|
addr->sin_addr.s_addr = ((struct in_addr *) (hp->h_addr))->s_addr;
|
|
addr->sin_port = htons(hid.port);
|
|
|
|
_addrs.push_back(addr);
|
|
}
|
|
}
|
|
|
|
|
|
void Group::broadcast(Message & msg){
|
|
if (DEBUG)
|
|
printf("Group::broadcast -- enter\n");
|
|
std::vector<sockaddr_in *>::iterator saIter;
|
|
|
|
for (int index = 0; index < _addrs.size(); index++){
|
|
this->sendto(msg, index);
|
|
}
|
|
|
|
if (DEBUG)
|
|
printf("Group::broadcast -- exit\n");
|
|
}
|
|
|
|
|
|
void Group::sendto(Message &msg, int index){
|
|
sockaddr_in * addr = _addrs[index];
|
|
|
|
if (DEBUG)
|
|
printf("Group::sendto -- for\n");
|
|
|
|
int message_len = msg.getRawSize();
|
|
char * message = msg.getRaw();
|
|
|
|
int en;
|
|
|
|
if (DEBUG)
|
|
printf("Group::sendto -- got mesg\n");
|
|
|
|
if ((en = ::sendto(_socket_desc,
|
|
message,
|
|
message_len,
|
|
0,
|
|
(struct sockaddr*)addr,
|
|
sizeof(struct sockaddr_in)) < 0)){
|
|
|
|
perror("sendto failed\n");
|
|
/* error */
|
|
exit(-2);
|
|
} else {
|
|
if (DEBUG)
|
|
printf("Group::sendto -- done\n");
|
|
}
|
|
}
|
|
|
|
#undef DEBUG
|