Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - AlbertoBSD

#681
Programación C/C++ / CreateThread o CreateProcess
21 Septiembre 2016, 17:07 PM
Estoy haciendo un servidor en C el tema es cual funcion debo elegir como la deberia de aplicar.

Tengo 2 versiones de mi servidor, una para sistemas Unix y otra para Windows.

En unix no hay problema solo hago un fork y asunto resuelto:

if(listen(ListenSocket, BACKLOG) == -1) {
perror("error: listen");


        return 1;
    }
while(entrar) {
pid = fork();
switch(pid) {
case 0:
//Codigo para el Hijo
break;
case -1:
//Error no fallo Fork
break;
default:
//Get the PID for Parent
break;
}
}


Pero no he encontrado una solucion para Windows, el servidor funciona bastante bien, el punto que en windows no es Multihilo aun, y tarda en responder ya que lo hace en orden secuencial.

He visto los siguientes enlaces y aun no doy con una solucion sencilla al tema

http://stackoverflow.com/questions/985281/what-is-the-closest-thing-windows-has-to-fork
http://stackoverflow.com/questions/14642496/any-simple-quick-way-to-fork-on-windows-ansi-c-beginthread-beginthreadex

Repito tengo 2 archivos distintos uno para Windows con winsock y el otro para Unix con Sockets estandar del sistema.

Saludos!
#682
De las 2 formas es valido.

Si es la misma cantidad de registros no hay por que preocuparse...

Se mueve a la posicion 0 con fseek y se escribe registro por registro.

En caso de que quieraa reescribir (borrar y escribir)

Solo hay que cerrar el archivo actual y abrir uno nuevo con el mismo nombre y en modo "w" o "wb" segun sea de texto o binario y asi escribir registro por registro en el archivo nuevo.

Saludos
#683
Bueno escribo por si alguien tiene el mismo problema

Un agregador en servicios móviles es un servicio donde por X cantidad de dinero semanal el usuario tiene acceso a un "servicio y/o beneficio" si es que realmente sirven de algo, cosa que dudo mucho.

Hace unos días mi numero móvil fue agregado a una lista de Servicios de estos servicios, En teoria estos servicios necesitan confirmación por parte del usuario para ser dado de alta pero la verdad NO ES ASI.

Ver tweets:

https://twitter.com/albertobsd/status/769922393158455297
https://twitter.com/albertobsd/status/769194215318310912

No se como, ni quien fue el responsable de hacer esto, en Atención a clientes de mi proveedor (TELCEL) indican que no existe forma para suscribirse a estos servicios sin que el usuario lo confirme mediante mensaje de texto. Y si les dices que no fuiste tu o cualquier otra cosa vuelven a repetirte lo mismo como grabadora parece que tienen esa indicacion y/o no tienen mente propia

Sospecho las siguientes causas:

  • Te suscribe la misma compañía para sacarte mas dinero
  • Visitastes algun sitio con ads/scripts intrusivos que te suscribieron automáticamente a X servicio

Sospecho lo primero por que en mi caso sucedió exactamente una semana después de cancelar el contrato que tenia con ellos.
Y de lo segundo ya que como programador y aprendiz de hacker se que es posible crear algunos scripts que exploten algun bug en tu movil y envien mensajes de texto silenciosos.


DARTE DE BAJA

Para el caso de telcel tenemos las siguientes opciones:




Anterioremente

Hace años circulaban varias paginas de Internet donde estaba un formulario para agregar un numero de celular a estos servicios, paginas amarillistas como "la fecha de tu muerte", "bruja real", "Video no apto para cardiacos" etc...

Cada vez he visto menos de estas paginas pero lo interesare seria ver para quien trabajan estas paginas y tirarles el servicio.

Historias relacionadas:

https://www.reddit.com/r/mexico/comments/o8bc1/telcel_los_agregadores_de_contenido_y_su_nueva/
https://www.reddit.com/r/mexico/comments/3sbr79/quien_regula_a_los_agregadores_de_contenido_en/
#684
El apuntadador que estas pasando es un int no un t_cuatro

deberia de quedar asi
void MODIFICAR(int *pa, int *pb, int *pc, int *pd);

void MODIFICAR(int *pa, int *pb, int *pc, int *pd)
{
t_cuatro aux;


if(((*pb)< (*pc) ) && ((*pb)< (*pd)) && ((*pb) < (*pa)))
{
aux.a=(*pa);
*pa=*pb;
*pb=aux.a;
}

if((*pc)< (*pa) && (*pc)< (*pd) && (*pc) < (*pb))
{
aux.a=*pa;
*pa=*pc;
*pc=aux.a;
}
   if((*pd)< (*pa) && (*pd)< (*pc) && (*pd) < (*pb))
{
aux.a=*pa;
*pa=*pd;
*pd=aux.a;
}
}


Saludos!
#685
Nunca lo he provado de esa forma prefiero manejarlo desde el SEEK_SET para hacerlo desde el inicio del archivo. lo que me gusta hacer es tener un contador para saber cual es el numero de registro actual y si quiero regrersar al que previamente lei lo que hago es

fseek(file, (contador-1)*sizeof(Idiomas), SEEK_SET);

Tendria que probar con la posición SEEK_CUR como lo mencionas.

Saludos!
#686
Eso me pasa por no leer la documentacion de la funcion  ;D  ;-) ;-) ;-)

Ya quedo mas optimizada mi funcion, muchas gracias  :xD
#687
El otro problema que veo es que estas usando la misma variable para iterar en todos los datos.

El "i" se reinicailiza cuando muestras datos y deberias de usar otra variable cuando queras agregar datos nuevos, como por ejemplo tener una variable que siempre guarde el numero del ultimo registro guardado en el arreglo.

Saludos!
#688
No estoy seguro de cuales son los datos ingresados pero el problema puede ser el strcmp, ya que solo lo tienes mejor que cero y strcmp puede devolver -1, 0 o 1 segun sea menor, igual o mayor deberias de cambiarlo por !=

strcmp( tmp.ingles, idiomas.ingles ) != 0

Saludos!
#689
Muchas gracias MAFUS segui mas o menos tu consejo y quedo asi el codigo:

void server_print(struct peticion *session,char *format,...) {
int len = 0,count = 0,i,X;
char *buffer = NULL;
struct m_args *arreglo = NULL;
va_list args;
va_start(args, format);
len = strlen(format);
X = len;
i = 0;
while(i < len) {
if(format[i] == '%') {
i++;
printf("Evaluando %c\n",format[i]);
switch(format[i]) {
case 's':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+= strlen((char*)arreglo[count].valor);
count++;
break;
case 'i':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=11;
count++;
break;
case 'u':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=11;
count++;
break;
case 'd':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=11;
count++;
break;
case 'f':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=11;
count++;
break;
case 'x':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=11;
count++;
break;
case 'l':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=20;
count++;
break;
case 'c':
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=1;
count++;
break;
case '%':
X+=1;
break;
default:
arreglo = realloc(arreglo,sizeof(struct m_args)*(count+1));
arreglo[count].valor = va_arg(args, void *);
X+=20;
count++;
break;
}
}
i++;
}
free(arreglo);
va_end(args);
buffer = malloc(X+1);
va_start(args, format);
vsnprintf(buffer,X,format, args);
va_end(args);
buffer[X] = 0;
len = strlen(buffer);
printf("Longitud reservada %i vs Real %i\n",X,len);
X = session->reply_length + len;
session->reply = realloc(session->reply,X+1);
memcpy(session->reply+ session->reply_length,buffer,len);
session->reply[X] = 0;
session->reply_length = X;
free(buffer);
}


Resulta que podria llamar varias veces a va_start(args, format); y va_end...

Y asi solo itere sobre los argumentos viendo su tipo (Segun el formato de Cadena) reserve la memoria mas o menos necesitada por el tipo y volvi a llamar a va_start para posteriormente hacer un vsnprintf

vsnprintf(buffer,X,format, args);

Aun asi me faltan los formatos mas especializados pero eso con tiempo lo voy hacer, puse un default de +20 bytes por parametro "desconocido"



Saldos!
#690
La condicion de tu do-while esta mal.


do{
// Omitido
printf("\nDesea regresar al menu?\n1.Regresar al menu / 2.Salir: ");
    scanf("%d", &OP);
}  while(i=0,i<10,i++);



Cuando deberia de ser
do{
// Omitido
printf("\nDesea regresar al menu?\n1.Regresar al menu / 2.Salir: ");
    scanf("%d", &OP);
}  while(OP !=2);


Saludos!