#include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct packet { int length; char name[50]; char msg[256]; } Packet; int main( int argc, char * argv[] ) { int Soquet, status1, status2, reusar, i, i2, LReceptor; /* Grupo y Receptor variables para manejo de conexión */ struct sockaddr_in Grupo, Receptor; /* Minfo contiene informacion para multicast */ struct ip_mreq Minfo; /* Cola es la estructura que recibe mensajes */ Packet cola; unsigned int mcGroup; char loop, ttl, *comando, *mensaje; fd_set readfds, readfdsCopy; /* Comando es el string que recibira algun comando */ comando=(char*)malloc(50); /* mensaje contendra parametro de algun comando */ mensaje=(char*)malloc(256); /* Estableciendo el soquet */ Soquet = socket (PF_INET,SOCK_DGRAM,0); reusar=1; if (setsockopt(Soquet ,SOL_SOCKET,SO_REUSEADDR,(char *) &reusar,sizeof(reusar)) == -1 ) { printf("Error en setsockopt,SO_REUSEPORT\n"); exit(-1); } Grupo.sin_family = AF_INET; Grupo.sin_addr.s_addr = htonl(INADDR_ANY); Grupo.sin_port = htons(atoi(argv[3])); if (bind(Soquet, (struct sockaddr *)&Grupo, sizeof(Grupo)) < 0) { printf("Imposible realizar el Bind\n"); exit(-1); } if ((mcGroup = inet_addr(argv[2]))== -1) printf("error in inet_addr\n"); Minfo.imr_multiaddr.s_addr = mcGroup; Minfo.imr_interface.s_addr = INADDR_ANY; if (setsockopt(Soquet,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &Minfo,sizeof(Minfo)) == -1 ) { printf("Error al ingresar al grupo\n"); exit(-1); } Grupo.sin_addr.s_addr= mcGroup; loop = 1; if ( setsockopt(Soquet, IPPROTO_IP,IP_MULTICAST_LOOP,(char *) &loop, sizeof(u_char)) == -1 ) { printf("Error al setear el loopback\n"); } ttl = 5; if ( setsockopt(Soquet ,IPPROTO_IP,IP_MULTICAST_TTL,(char *) &ttl, sizeof(u_char)) == -1 ) { printf("Error al setear el valor del loopback\n"); } FD_ZERO(&readfdsCopy); FD_SET(Soquet,&readfdsCopy); FD_SET(0,&readfdsCopy); for(;;) { memcpy(&readfds, &readfdsCopy, sizeof(fd_set)); status1 = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, NULL); if (status1 > 0) { if (FD_ISSET(Soquet, &readfds)) { LReceptor = sizeof(Receptor); /* Recibiendo mensajes */ if ((status2=recvfrom(Soquet, (char *)&cola, sizeof(cola), 0,(struct sockaddr *)&Receptor,&LReceptor)) < 0) printf("Error al recibir mensaje\n"); if (status2 > 0) { cola.msg[(strlen(cola.msg))]='\0'; strcpy(comando," \0"); strcpy(mensaje," \0"); /* Verificando si viene algun comando */ if (cola.msg[0]=='/') { i=1; while (cola.msg[i]!=' ') { comando[i-1]=cola.msg[i]; i++; } comando[i-1]='\0'; i++; i2=0; /* Si comando no es '/me', obtener parámetro de comando */ if (strcmp(comando,"me")!=0) while (cola.msg[i]!=' ') { mensaje[i2]=cola.msg[i]; i++; i2++; } mensaje[i2]='\0'; /* Si comando es '/me', mensaje = resto del mensaje */ if (strcmp(comando,"me")==0) { i2=0; while (i!=strlen(cola.msg)) { mensaje[i2]=cola.msg[i]; i++; i2++; } mensaje[i2]='\0'; printf("* %s %s\n", cola.name, mensaje); } /* Mensajes a pantalla de mensajes, de acuerdo al comando */ else if (strcmp(comando,"saludo")==0) printf("* %s saluda cordialmente a %s\n", cola.name, mensaje); else if (strcmp(comando,"maldicion")==0) printf("* %s conjura a Mr.Satan para que %s repruebe Seminario I\n",cola.name,mensaje); else if (strcmp(comando,"quit")==0) printf("(%s se desconectó)\n",cola.name); } /* Mensaje sin comando */ else printf("%s: %s\n", cola.name, cola.msg); } } } } return (0); }