Discussion:
sockets + multitarea
(demasiado antiguo para responder)
chakal^-^
2006-10-10 09:23:06 UTC
Permalink
Hola, estoy haciendo un escáner de proxys para probar que se pueden
usar para conectar al IRC, el problema es que tarda demasiado el cierre
de conexión pasado x segundos, me gustaría que se cerrara en 10
segundos para que no tardara tanto, me dijeron que usando select() peor
no soy capaz de anidar el select, no recuerdo muy bien su
funcionamiento, el código es el siguiente, tal cual funciona, se le
pasa como parámetro el archivo de proxys (supuestas) donde contiene la
ip y el puerto:

1.1.1.1 80
2.2.2.2 8080
....

el código es el siguiente:


#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>

#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>

#define File_Proxys "/home/chakal/proxys"

int main(int argc, char *argv[])
{
int sck;
int cn;
int puerto;
FILE *pf;
char buffer[2058];
char *direccion;
char buff[64];
char backup[128];
struct sockaddr_in IP;

memset(buffer,0x00,sizeof(buffer));
memset(buff,0x00,sizeof(buff));
memset(&direccion,0x00,sizeof(direccion));
memset(backup,0x00,sizeof(backup));


pf=fopen(argv[1],"r");
fgets(buff,30,pf);
while(!feof(pf))
{
strcpy(backup,buff);
direccion=strtok(buff," ");
puerto=atoi(strrchr(backup,' '));

if (( sck=socket(PF_INET,SOCK_STREAM,0))==-1) {
perror("Error en la creacion del socket:");
fgets(buff,30,pf);
continue;
}


IP.sin_family=AF_INET;
IP.sin_port=htons(puerto);
IP.sin_addr.s_addr=inet_addr(direccion);

if((cn=connect(sck,(struct sockaddr *)&IP,sizeof(struct
sockaddr)))==-1) {
close(sck);
fgets(buff,30,pf);
continue;
}

send(sck,"CONNECT irc.irc-hispano.org:6667
HTTP/1.0\n\n\r",44,0);
recv(sck,buffer,sizeof(buffer),0);

if(strstr(buffer,"HTTP/1.0 200 Connection
established")) {
printf("%s %i OK\n",direccion,puerto);
close(sck);
}
else {
printf("%s %i NO\n",direccion,puerto);
close(sck);
}

fgets(buff,30,pf);
}

fclose(pf);
return(0);
}


Me gustaría saber como meter un sleep(10); , pero claro, si lo meto
tal cual nunca se establece la conexión, simplemente se bloquea el
programa pasado los 10 segundos ...

salu2
chakal^-^
2006-10-10 13:05:17 UTC
Permalink
Tengo lo siguiente (ya me voy acercando):

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

#define File_Proxys "/home/chakal/proxys"

int main(int argc, char *argv[])
{
int sck;
int cn;
int puerto;
FILE *pf;
char buffer[2058];
char *direccion;
char buff[64];
char backup[128];
struct sockaddr_in IP;
struct timeval tv;
int valret;

fd_set rd;
FD_ZERO(&rd);

tv.tv_sec = 1;
tv.tv_usec = 0;

memset(buffer,0x00,sizeof(buffer));
memset(buff,0x00,sizeof(buff));
memset(&direccion,0x00,sizeof(direccion));
memset(backup,0x00,sizeof(backup));

pf=fopen(argv[1],"r");
fgets(buff,30,pf);
while(!feof(pf))
{
strcpy(backup,buff);
direccion=strtok(buff," ");
puerto=atoi(strrchr(backup,' '));

if (( sck=socket(PF_INET,SOCK_STREAM,0))==-1) {
perror("Error en la creacion del socket:");
fgets(buff,30,pf);
continue;
}

FD_SET(sck,&rd);

IP.sin_family=AF_INET;
IP.sin_port=htons(puerto);
IP.sin_addr.s_addr=inet_addr(direccion);

valret = select(sck+1,&rd,0,0,&tv);

if((cn=connect(sck,(struct sockaddr *)&IP,sizeof(struct
sockaddr)))==-1) {
close(sck);
fgets(buff,30,pf);
continue;
}

send(sck,"CONNECT irc.irc-hispano.org:6667
HTTP/1.0\n\n\r",44,0);
recv(sck,buffer,sizeof(buffer),0);

if (valret) {
if(strstr(buffer,"HTTP/1.0 200 Connection
established")) {
printf("%s %i OK\n",direccion,puerto);
close(sck);
fgets(buff,30,pf);
}
}
else {
close(sck);
fgets(buff,30,pf);
}
}

fclose(pf);
return(0);
}


Pero se queda esperando respuesta del servidor, algunos se queda
minutos, no entiendo, si puse tv.tv_sec = 1; por probar y nada ...

salu2
AnimAlf
2006-10-11 16:37:06 UTC
Permalink
Puedes utilizar un proceso hijo y tras cierto tiempo si sigue trabajando
le dices que finalice, por ejemplo

#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <signal.h>

void manejadorHijo() {
int pidHijo, estadoHijo;
pidHijo = wait (&estadoHijo); // aceptar codigo de finalización
exit;
}
Post by chakal^-^
#define File_Proxys "/home/chakal/proxys"
int main(int argc, char *argv[])
{
int pid;
signal (SIGCHLD, manejadorHijo); /* Intala el finalizador de hijos */
Post by chakal^-^
int sck;
int cn;
int puerto;
FILE *pf;
char buffer[2058];
char *direccion;
char buff[64];
char backup[128];
struct sockaddr_in IP;
struct timeval tv;
int valret;
fd_set rd;
FD_ZERO(&rd);
tv.tv_sec = 1;
tv.tv_usec = 0;
memset(buffer,0x00,sizeof(buffer));
memset(buff,0x00,sizeof(buff));
memset(&direccion,0x00,sizeof(direccion));
memset(backup,0x00,sizeof(backup));
pf=fopen(argv[1],"r");
fgets(buff,30,pf);
while(!feof(pf))
{
pid = fork();
if (pid == 0) { /* Inicias el proceso hijo */
Post by chakal^-^
strcpy(backup,buff);
direccion=strtok(buff," ");
puerto=atoi(strrchr(backup,' '));
if (( sck=socket(PF_INET,SOCK_STREAM,0))==-1) {
perror("Error en la creacion del socket:");
fgets(buff,30,pf);
continue;
}
FD_SET(sck,&rd);
IP.sin_family=AF_INET;
IP.sin_port=htons(puerto);
IP.sin_addr.s_addr=inet_addr(direccion);
valret = select(sck+1,&rd,0,0,&tv);
if((cn=connect(sck,(struct sockaddr *)&IP,sizeof(struct
sockaddr)))==-1) {
close(sck);
fgets(buff,30,pf);
continue;
}
send(sck,"CONNECT irc.irc-hispano.org:6667
HTTP/1.0\n\n\r",44,0);
recv(sck,buffer,sizeof(buffer),0);
if (valret) {
if(strstr(buffer,"HTTP/1.0 200 Connection
established")) {
printf("%s %i OK\n",direccion,puerto);
close(sck);
}
}
else {
close(sck);
}
} else {
sleep(espera);
kill(pid, SIGINT); /* finalizando al hijo */
waitpid (pid); //esperemos a que termine
fgets(buff,30,pf); //Lee aquí la siguiente línea
}
Post by chakal^-^
}
fclose(pf);
return(0);
}
La cosa iría por ahí, ahora estudialo un poco, creo que te puede ir por
ahí

bye
void
2006-10-12 00:17:58 UTC
Permalink
Post by chakal^-^
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <fcntl.h>
#define File_Proxys "/home/chakal/proxys"
int main(int argc, char *argv[])
{
int sck;
int cn;
int puerto;
FILE *pf;
char buffer[2058];
char *direccion;
char buff[64];
char backup[128];
struct sockaddr_in IP;
struct timeval tv;
int valret;
fd_set rd;
FD_ZERO(&rd);
tv.tv_sec = 1;
tv.tv_usec = 0;
memset(buffer,0x00,sizeof(buffer));
memset(buff,0x00,sizeof(buff));
memset(&direccion,0x00,sizeof(direccion));
memset(backup,0x00,sizeof(backup));
pf=fopen(argv[1],"r");
fgets(buff,30,pf);
while(!feof(pf))
{
strcpy(backup,buff);
direccion=strtok(buff," ");
puerto=atoi(strrchr(backup,' '));
if (( sck=socket(PF_INET,SOCK_STREAM,0))==-1) {
perror("Error en la creacion del socket:");
fgets(buff,30,pf);
continue;
}
FD_SET(sck,&rd);
IP.sin_family=AF_INET;
IP.sin_port=htons(puerto);
IP.sin_addr.s_addr=inet_addr(direccion);
valret = select(sck+1,&rd,0,0,&tv);
Creo que el error esta aca, valret no contiene la informacion que
buscas, para eso tienes que utilizar el macro FD_ISSET (una relectura
del man de select debe aclararte ese punto)
Post by chakal^-^
if((cn=connect(sck,(struct sockaddr *)&IP,sizeof(struct
sockaddr)))==-1) {
close(sck);
fgets(buff,30,pf);
continue;
}
send(sck,"CONNECT irc.irc-hispano.org:6667
HTTP/1.0\n\n\r",44,0);
recv(sck,buffer,sizeof(buffer),0);
if (valret) {
if(strstr(buffer,"HTTP/1.0 200 Connection
established")) {
printf("%s %i OK\n",direccion,puerto);
close(sck);
fgets(buff,30,pf);
}
}
else {
close(sck);
fgets(buff,30,pf);
}
}
fclose(pf);
return(0);
}
Pero se queda esperando respuesta del servidor, algunos se queda
minutos, no entiendo, si puse tv.tv_sec = 1; por probar y nada ...
salu2
--
Moridunon
Loading...