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*/
Beispiel #2
0
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);
}