int RegistroCancion::cargar(const char* dato,unsigned short tamanioDato)throw(){ int resCarga = RegistroVariable::agregar_datos(dato,tamanioDato); if (resCarga != RES_OK) return resCarga; // El autor, el titulo y el idioma son obligatorios if (contar_parametros() < 3){ limpiar_buffer(); return RES_ERROR; } if (this->obtener_autores() == 0){ limpiar_buffer(); return RES_ERROR; } if (this->obtener_anio_grabacion() == -1){ limpiar_buffer(); return RES_ERROR; } if (this->obtener_titulo() == false){ limpiar_buffer(); return RES_ERROR; } if (this->obtener_idioma() == false) { limpiar_buffer(); return RES_ERROR; } if (this->obtener_letra() == false) { limpiar_buffer(); return RES_ERROR; } char bufferAuxiliar [REG_VAR_MAX_TAM]; this->empaquetar(bufferAuxiliar); return RES_OK; }/*carga los datos del registro a partir de un buffer de datos*/
void traer (int s,struct sockaddr_in *info) { char *respuesta[] = { "OKEY", // Puede llevar acompañado un parámetro indicando la hora (t(mt)) del servidor de de tiempos, o no llevar nada. "FINN" // Puede ir acompañado de un string explicativo de porqué se ha producido la negativa. }; // variables auxiliares. int k,lon,lon2; char buf[TAMBUF]; struct timeval horaservidor; struct tm *tmp; // Espera el envío del comando OPEN. k=read(s,buf,TAMBUF); if (k<0) { perror("\nRecepcion Comando OPEN"); return; } buf[k]='\0'; if ((compara_comandos(comandos[0],buf)) == 0) { perror("\nComando desconocido"); sprintf(buf,"%s: Comando OPEN esperado",respuesta[1]); write(s,buf,strlen(buf)); } // Todo correcto. Devolvemos OKEY y esperamos a que nos manden un comando, que desde este momento // puede ser: SYNC o TERM sprintf(buf,"%s: Sesion abierta",respuesta[0]); write(s,buf,strlen(buf)); printf("\nIP=%ld Conectado\n",ntohl(info->sin_addr.s_addr)); // Entramos en el bucle de recepción de comandos. do { k=read(s,buf,TAMBUF); if (k<0) { perror("\nRecepción de un comando"); return; } buf[k]='\0'; switch(parser_comandos(buf)) { case 1: // SYNC /* calcular hora del servidor */ gettimeofday(&horaservidor,NULL); // el servidor le envia como respuesta: // OK + // segundos (el valor comienza en &buf[10]) + // microsegundos (el valor comienza en &buf[35]) sprintf(buf,"%s: seg:%ld\0",respuesta[0],horaservidor.tv_sec); lon=strlen(buf); limpiar_buffer(buf,lon+1,29); sprintf(&buf[30],"useg:%ld\0",horaservidor.tv_usec); lon2=strlen(&buf[30]); write(s,buf,30+lon2); tmp=(struct tm*)localtime(&(horaservidor.tv_sec)); printf("\nIP=%ld Sincronizando ...\n",ntohl(info->sin_addr.s_addr)); printf(" t(mt): %d hrs. %d mns. %d sgs. %ld usgs.\n",tmp->tm_hour,tmp->tm_min,tmp->tm_sec,horaservidor.tv_usec); break; case 2: // TERM sprintf(buf,"%s: Cerrando sesion ...",respuesta[0]); write(s,buf,strlen(buf)); close(s); printf("\nIP=%ld Desconectado\n",ntohl(info->sin_addr.s_addr)); return; case 0: // OPEN sprintf(buf,"%s: Error de protocolo en el cliente",respuesta[1]); write(s,buf,strlen(buf)); close(s); return; default: sprintf(buf,"%s: Comando desconocido",respuesta[1]); write(s,buf,strlen(buf)); close(s); return; } } while (1); }