C/Visual C - multicast en C

 
Vista:

multicast en C

Publicado por javi (4 intervenciones) el 13/09/2007 01:11:29
Hola foro
ME gustaría hacer una aplicación en C usando multicast que varios clientes envíen una cantidad de dinero a un servidor, y éste responda enviando a todos los clientes la mayor cantidad de dinero recibida. ¿Cómo podría hacerlo?
El principal problema lo tengo en enviar de los clientes al servidor, ya que la mayoría de código que he visto se envía del servidor al cliente,(problema relacionado con las direcciones sobre todo)
Si alguien me pudiera ayudar o envíar un código en el que se haga algo parecido se lo agradecería enormemente.

Muchas gracias y un saludo
Javier
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:multicast en C

Publicado por Nelek (816 intervenciones) el 13/09/2007 08:44:11
Si el principal problema lo tienes del cliente al servidor... por que no pones un pedazo de codigo explicando donde te atascas y asi podremos ayudarte mejor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:multicast en C

Publicado por javi (4 intervenciones) el 15/09/2007 17:40:08
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
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar