Mira el código que uso es el siguiente y mi idea es que un cliente envíe un mensaje a un servidor y este lo envie a todos los miembros del grupo.
CLIENTE
#define GROUP_IP "225.0.0.0"
#define PORT 6500
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 12000
int main(int argc,char *argv[])
{
void funcionCliente(int,struct sockaddr *,int,struct sockaddr *,int);
int socketid;
struct ip_mreq mreq;
struct sockaddr_in addr,server_addr;
u_int yes=1;
//lo primero que hacemos es crear el socket cliente
if((socketid=socket(AF_INET,SOCK_DGRAM,0))<0)
perror("Can`t create socket");
//permitimos poder reusar el puerto
if(setsockopt(socketid,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes))<0)
{
perror("Error al intentar reusar la dirección");
exit(1);
}
//inicializamos la estructura del servidor
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);
server_addr.sin_port=htons(SERVER_PORT);
//inicializamos la estructura del grupo
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(PORT);
//unimos el socket a la dirección
if(bind(socketid,(struct sockaddr *)&addr,sizeof(addr))<0)
perror("El socket no se pudo unir al puerto");
//NOS UNIMOS AL GRUPO
//lo primero que hacemos es inicializar la estructura ip_mreq
mreq.imr_multiaddr.s_addr=inet_addr(GROUP_IP);
mreq.imr_interface.s_addr=htonl(INADDR_ANY);
if(setsockopt(socketid,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))<0)
{
perror("Can't bind group");
exit(1);
}
funcionCliente(socketid,(struct sockaddr *)&server_addr,sizeof(server_addr),(struct sockaddr *)&addr,sizeof(addr));
close(socketid);
}
void funcionCliente(int socketid,struct sockaddr *server_addr,int tamServerAddr,struct sockaddr *group_addr,int tamGroup)
{
socklen_t tam;
char lineaRecibida[256],lineaEnviada[256];
int n;
//tam=tamAddr;
while(fgets(lineaEnviada,256,stdin)!=NULL)
{
n=strlen(lineaEnviada);
if(sendto(socketid,lineaEnviada,n,0,server_addr,tamServerAddr)!=n)
perror("Error al realizar el envío");
bzero((char *)lineaRecibida,256);
recvfrom(socketid,lineaRecibida,256,0,group_addr,(socklen_t *)&tamGroup);
n=strlen(lineaRecibida);
lineaRecibida[n]='\0';
fprintf(stdout,"%s",lineaRecibida);
}
}
//SERVIDOR
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define IP_GROUP "225.0.0.0"
#define PORT 6500
#define SERVER_ADDR "127.0.0.1"
#define SERVER_PORT 12000
int main(int argc,char *argv[])
{
void funcionServidor(int, struct sockaddr *,int,struct sockaddr *,int);
int socketid;
struct sockaddr_in addr_group,server_addr,cliente_addr;
//creamos el socket
if((socketid=socket(AF_INET,SOCK_DGRAM,0))<0)
perror("Can't create server socket");
//inicializamos la estructura
addr_group.sin_family=AF_INET;
addr_group.sin_port=htons(PORT);
addr_group.sin_addr.s_addr=inet_addr(IP_GROUP);
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVER_PORT);
server_addr.sin_addr.s_addr=inet_addr(SERVER_ADDR);
if(bind(socketid,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)
perror("No se pudo conectar al puerto");
funcionServidor(socketid,(struct sockaddr *)&addr_group,sizeof(addr_group),(struct sockaddr *)&cliente_addr,sizeof(cliente_addr));
}
void funcionServidor(int socketid,struct sockaddr *addr_group, int tamAddr_group,struct sockaddr *cliente_addr,int tamCliente)
{
char mensajeRecibido[2048];
int n;
tamCliente=sizeof(cliente_addr);
for(;;)
{
n=recvfrom(socketid,mensajeRecibido,2048,0,cliente_addr,(socklen_t *)&tamCliente);
mensajeRecibido[n]='\0';
fprintf(stdout,"El servidor ha recibido=%s",mensajeRecibido);
if(n<0)
perror("Error al recibir el mensaje");
if(sendto(socketid,mensajeRecibido,n,0,addr_group,tamAddr_group)!=n)
{
perror("No se pudo enviar el mensaje");
}
}
}
Si me pudieras ayudar te lo agradería enormemente.
Muchas gracias y un saludo
Javier