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 - 0xDani

#771
Cita de: xiruko en 27 Octubre 2012, 21:50 PM
sin el codigo completo es algo dificil adivinar de donde viene el error... :rolleyes:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <sys/types.h>
#include <signal.h>

#define MAX_dani 0xF0000

struct params{
  char web[20];
  int port;
  int thread;
  int nrequests;
  int sleeptime;
};

int total_requests;
pthread_mutex_t lock;
int nthreads;

void* t(void *p)
{
  int n = ((struct params*)p)->thread + 1;
  printf("Proceso %i: presente\n", n);
  char request[128];
  char buff[10000] = {'\0'};
  struct hostent *host = gethostbyname(((struct params*)p)->web);
  if(!host)
  {
    printf("Proceso %i: No se ha podido resolver la direccion del servidor\n", n);
    return NULL;
  }
  printf("Proceso %i: host->h_addr: %s\n", n, inet_ntoa(*((struct in_addr *)host->h_addr)));
  struct sockaddr sockbuf;
  int stsize = sizeof(sockbuf);
  struct sockaddr_in sock;
  sock.sin_family = AF_INET;
  sock.sin_port = htons(((struct params*)p)->port);
  sock.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)host->h_addr)));
  printf("Proceso %i: Direccion: %d\n", n, sock.sin_addr.s_addr);

int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sockfd==-1)
{
  printf("Proceso %i: No se pudo crear el socket\n", n);
  return NULL;
}
printf("Proceso %i: Socket creado\n", n);
printf("Proceso %i: Conectando...\n", n);
int aux;
connect(sockfd, (struct sockaddr*) &sock, sizeof(struct sockaddr));
printf("Proceso %i: Conectado\n", n);
sprintf(request, "GET / HTTP/1.1\nHost: %s\nUser-Agent: Mozilla/4.0\n\n ", host->h_name);
printf("Proceso %i: Peticion en request\n", n);
for(aux=0; aux<(((struct params*)p)->nrequests); aux++)
{
   switch(getpeername(sockfd, &sockbuf, &stsize))
   {
    case 0: break;
    case ENOTCONN:
     printf("Proceso %i: reconectando socket...", ((struct params*)p)->thread);
     close(sockfd);
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if(connect(sockfd, (struct sockaddr*) &sock, sizeof(struct sockaddr))==-1) continue;
     else break;
   }
   write(sockfd, request, strlen(request));
   printf("Proceso %i: %i peticion/es\n", n, aux+1);
   pthread_mutex_lock(&lock);
   total_requests++;
   sleep((((struct params*)p)->sleeptime)/nthreads);
   pthread_mutex_unlock(&lock);
}
close(sockfd);
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_mutex_init(&lock, NULL);
pthread_t *mythreads = (pthread_t*)malloc(atoi(argv[1])*sizeof(pthread_t));
pthread_attr_t a;
struct params *p = (struct params*)malloc(atoi(argv[1])*sizeof(struct params));
int i, ret, j;
nthreads = atoi(argv[1]);
for(j=0; j<nthreads; j++)
{
  strcpy(p[j].web, argv[2]);
  p[j].thread = j;
  p[j].port = atoi(argv[3]);
  p[j].nrequests = atoi(argv[4]);
  p[j].sleeptime = atoi(argv[5]);
}
pthread_attr_init(&a);
pthread_attr_setstacksize(&a, MAX_dani);
for(i=0; i<nthreads; i++)
{
  ret = pthread_create(&mythreads[i], &a, t, &p[i]);
  switch(ret)
  {
   case 0:
    printf("Thread %i creado\n", i+1);
    break;
   case EAGAIN:
    printf("EAGAIN\n");
    _exit(1);
   case EINVAL:
    printf("EINVAL\n");
    _exit(2);
   case EPERM:
    printf("EPERM\n");
    _exit(3);
  }
}
pthread_attr_destroy(&a);
for(j=0; j<nthreads; j++)
pthread_join(mythreads[j], NULL);
pthread_mutex_destroy(&lock);
printf("Retornaron los hilos\n");
printf("Total de peticiones: %i\n", total_requests);
return 0;
}


Es un flooder, o al menos eso intento. Los parametros son: numero_de_threads web puerto(80) numero_de_peticiones_por_thread tiempo_de_espera. Si le pones 2 threads y unos 10 segundos de espera funciona, pero a partir de 3 threads da igual el tiempo que le pongas, llega a hacer 2 o 3 peticiones por thread.

Saludos.
#772
Cita de: xiruko en 27 Octubre 2012, 20:54 PM
getpeername()

y para lo otro, aunque ya lo hayas encontrado, por si acaso no lo has hecho asi, tienes todos los errores definidos en el archivo de cabecera syscall.h, que lo tendras en /usr/include o por ahi.

un saludo!

He puesto un getpeername() antes de escribir al socket, y si retorna ENOTCONN (significa que no esta conectado) vuelve a tratar de reconectar hasta que lo consiga, pero sigue igual, se corta y retorna 141.
#773
Bueno pues tengo un programa, lo ejecuto y se corta a la mitad de la ejecucion, y al comprobar el valor de retorno:
echo $?
la salida es 141. ¿Que significa esto?

Saludos.

EDIT: Vale ya lo tengo, se ha enviado una señal SIGPIPE a mi proceso, parece que escribe sobre sockets que no estan conectados. Es decir, se me desconectan los sockets. ¿Puedo tratar de detectar si un socket esta conectado o no y reconectarlo sin que se cierre el programa?¿O de hacer un handler para esta señal?
#774
Cita de: wolfbcn en 26 Octubre 2012, 13:23 PM
Windows 8 ha llegado. Recopilamos detalles y novedades que no puedes dejar pasar : http://www.genbeta.com/windows/windows-8-ha-llegado-todos-los-detalles-y-novedades-que-no-puedes-dejar-pasar


No se que hace aqui esta publicidad de windows 8. Sinceramente, parece publicidad pagada.

Saludos.
#775
Cita de: drvy | BSM en 27 Octubre 2012, 14:47 PM
Estan comparando un sistema operativo para Tablets y Smartphones con un sistema operativo para PC's... WTF ?

Si Android ha superado a Windows Phone desde que este nacio... pero Windows ? Pero como leches vas a comparar un portatil o un ordenador con un telefono ? WTF!!

Saludos

Has visto los ordenadores con windows 8?
#776
Pues ahora mismo no se cual es el error, pero si solo usas stat() para saber si es un directorio o un archivo, en la estructura dirent tambien hay un campo que te lo dice: d_type.

y aqui hay un ejemplo de la funcion stat(): http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html

Saludos.
#777
Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.
#779
Cita de: naderST en 25 Octubre 2012, 03:57 AM
Está muy mal que les enseñen C++ y no empiecen por C. Con respecto a la librería NO ESTÁNDAR conio, no deberían ni mirarla, ya que como te dije no es estándar y hace que C/C++ pierda una de sus características principales que es la portabilidad.

Estoy de acuerdo con lo de conio, para hacer esas cosas no hace falta mas que la libreria estandar y si acaso algo de preprocesador, pero en cuanto a que haya que aprender C antes que C++ no. Probablemente es mas facil aprender con C primero, pero de ahi a que "este muy mal"...
#780
Cita de: zonahurbana en 25 Octubre 2012, 03:48 AM
¿Code::Blocks fue hecho con wxWidgets?

Bueno, hay algo que no me queda bien claro.
Cuando pregunté por cómo agregar un entorno gráfico a mis pequeños programas, me respondieron que revisara algunos temas de WinApi. Y pues, la verdad es que yo no me esperaba tener que escribir tanto código sólo para generar una ventana con los botones de maximizar, minimizar y cerrar (en Windows).
¿Hay alguna forma de hacer gráficos mis programas hechos en C++ sin la necesidad de reescribirlo y tratar con códigos de más de mil líneas?

Basicamente hay dos formas de reducir el codigo. Una, usar una de estas APIs, y la otra hacerte tu propia pequeña biblioteca basandote en la que quieras utilizar. Y si, Code::Blocks esta hecho usando wxWidgets.

Saludos.