Iosune
Registrado: 01 Sep 2008 Mensajes: 1
| Publicado: 01/09/2008 5:22 am | | | Título: servidor de chat compartido |
| Hola! Estoy haciendo un servidor de chat compartido en c que utiliza la función select y me he topado con un problema. He conseguido que se puedan conectar varios clientes y que se envien mensajes, pero quiero hacer unos comandos que ahora no me funcionan. Por un lado quiero hacer que ningún cliente pueda hablar si no ha ejecutado el comando /nombre para asignarse un nick. También quiero que con el comando /lista salga la lista de usuarios, tanto con nombre como invisibles. Y también quiero que con el comando /m se envien mensajes privados. Pues bien, intentando hacerlo he estropeado algo que no se lo que es, antes iba el comando nombre y ahora no me funciona ninguno. Había cambiado la función que sirve para aceptar un cliente, antes de eso funcionaba, aunque creo que he cambiado algo mas. Os pongo el código de la función que sirve para lo de los comandos, por si alguien me puediera ayudar, es que soy bastante novata con c . Muchas gracias de antemano!!!!!!! Muacks!!!
void evaluar_linea(char buf[2000],char *nombre[10],int descriptores[10],int cont){ char *ptr; char aux_buf[2000],cadena_corta[100]; /*Utilizamos corta para el cambio de nick*/ int i,priv=0,aux_int; strcpy(aux_buf,buf); ptr=strtok(aux_buf," "); printf("SERVIDOR : Evaluando linea enviada por %s\n",nombre[cont]);
if(strcmp("/nombre",ptr)==0){ /*Se ejecuta el comando nombre*/ priv=1; printf("SERVIDOR : %s ejecuta comando /nombre\n",nombre[cont]); ptr=strtok(NULL," "); free(nombre[cont]); nombre[cont]=(char *)malloc((strlen(ptr))*sizeof(char)); strcpy(nombre[cont],ptr); printf("SERVIDOR : Usuario%d es ahora %s\n",cont,nombre[cont]); sprintf(cadena_corta,"SERVIDOR : Usuario%d es ahora %s\0\n",cont,ptr); for(i=0;i<MAX_CLIENTES;i++){ if(descriptores[i]!=-1){ write(descriptores[i],cadena_corta,strlen(cadena_corta)); } } } if(strcmp("/lista\n",ptr)==0){ /*Se ejecuta el comando lista*/ priv=1; for(i=0;i<MAX_CLIENTES;i++){ if (descriptores[i]!=-1){ sprintf(aux_buf,"%d : %s \n",i,nombre[i]); write(descriptores[cont],aux_buf,strlen(aux_buf)); } } } if(strcmp("/m",ptr)==0){ /*Se ejecuta el comando para mensajes privados*/ priv=1; ptr=strtok(NULL," "); sscanf(ptr,"%d",&aux_int); printf("SERVIDOR : %s envia un mensaje privado a %s\n",nombre[cont],nombre[aux_int]); for(i=0;i<MAX_CLIENTES;i++){ if(aux_int==i){ ptr=strtok(NULL,"\n"); sprintf(cadena_corta,"%s te envia un mensaje privado : %s\n",nombre[cont],ptr); write(descriptores[i],cadena_corta,strlen(cadena_corta)); } } }
else { if (priv==0) { sprintf(aux_buf,"Usuario%d",cont); if(strcmp(aux_buf,nombre[cont])!=0){ sprintf(aux_buf,"%s dice : %s\0\n",nombre[cont],buf); for(i=0;i<MAX_CLIENTES;i++){ if(descriptores[i]!=-1){ write(descriptores[i],aux_buf,strlen(aux_buf)); } } } else{ sprintf(aux_buf,"SERVIDOR : No puedes enviar mensajes hasta que elijas nombre. Para ello utiliza el comando /nombre\n",descriptores[cont]); write(descriptores[cont],aux_buf,strlen(aux_buf)); } } } }
El código del lugar donde llamo a esta función es el siguiente:
for(i=0;i < MAX_CLIENTES;i++){ if(fd[i]!=-1){ if(FD_ISSET(fd[i],&leer)){ leido=read(fd[i],/*&*/buffer,2000); if(leido>0){ buffer[leido]='\0'; evaluar_linea(buffer,cliente,fd,i); } else { close(fd[i]); fd[i]=-1; numclientes--; printf("Ahora hay %d clientes\n",numclientes); } } } |
|