Accueil > Forum > > > > time sur socket en C
time sur socket en C
mercredi 2 mai 2007 à 13:09:19 |
time sur socket en C

yohan49
|
Salut les gars , je suis entrain de faire une scanner de proxy pour irc, donc j'utilise des socket lol je cherche a savoir comment mettre un timeout sur la fonction connect du socket en C , car 3 minutes de timeout sur cahque ports scanné , en cas d'attaque , 7 ports * 3 minutes !! lol une demi heure de scan !! donc si quelqu'un sait comment faire !! merci d'avance
|
|
mercredi 2 mai 2007 à 16:41:56 |
Re : time sur socket en C

rudybaka
|
Essaye d'envoyer un signal préalablement rédirigé juste avant ta fonction
signal(SIGALRM, sigalarm); // sigalarm est une fonction que tu defini toi meme
alarm(10); // en secondes
connect() ...
je pense que sa fonctionne mais je ne suis pas sur a 100% désolé
En esperant t'aider un peu
|
|
mercredi 2 mai 2007 à 18:14:33 |
Re : time sur socket en C

yohan49
|
y'a pas a dire c vraiment chiant c trois minutes
la fonction alarm dans un thread , ou je dois tester plusieur ports , quand l'alarm se produit , j'ai l'impression que mon thread se termine
grrrr
|
|
mercredi 2 mai 2007 à 18:34:16 |
Re : time sur socket en C

rudybaka
|
La fonction sigalarm n'est pas très importante, elle peut etre vide ou afficher un message d'erreur, c'est comme tu veux. elle sert juste a être appelé a la fin du timeout et ansi debloqué la fonction connect()
|
|
mercredi 2 mai 2007 à 23:12:53 |
Re : time sur socket en C

emmatopiak
|
Salut,
Y'a setsockopt avec parametre SO_RCVTIMEO ou SO_SNDTIMEO, mais suis pas sur :p
Donc essaye de voir si tu peux pas utiliser setsockopt, et notamment les parametres SO_RCVTIMEO et SO_SNDTIMEO, ou bien rendre ta socket non bloquante, sinon.
Ensuite.
la methode que te conseillait rudybaka c'etait de lancer ton connect dans un autre processus et quand tu recois l'alarme, tu killes ce processus.
@++
|
|
mercredi 2 mai 2007 à 23:20:59 |
Re : time sur socket en C

yohan49
|
jmp_buf timeout_jump ;
void timeout(int sig) { printf("timeou\n"); longjmp( timeout_jump, 1 ) ; }
int check_connect(char *iphost,int port) { struct hostent *serverHostEnt; struct sockaddr_in serverSockAddr; long hostAddr; int s = -1; int ret = 0;
if ((s = socket(PF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) return 0;
memset(&serverSockAddr, 0, sizeof(struct sockaddr_in));
memset(&serverSockAddr, 0, sizeof(serverSockAddr)); hostAddr = inet_addr(iphost); if ( (long)hostAddr != (long)-1) memcpy(&serverSockAddr.sin_addr, &hostAddr, sizeof(hostAddr)); else { serverHostEnt = gethostbyname(iphost); if(!serverHostEnt) return 0;
memcpy(&serverSockAddr.sin_addr, serverHostEnt->h_addr, serverHostEnt->h_length); }
setsockopt(s, SOL_SOCKET, SO_LINGER, 0, 0); setsockopt(s, SOL_SOCKET, SO_REUSEADDR, 0, 0); setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
serverSockAddr.sin_family = AF_INET; serverSockAddr.sin_port = htons(port);
// on arme le timeout signal( SIGALRM, timeout ) ; alarm( 1 ) ; if ( setjmp( timeout_jump ) == 1 ) // c'est un timeout { printf( "C'est un timeout : %s sur port %d\n",iphost,port ) ; close(s); return 0; } else { ret = connect(s,(struct sockaddr *)&serverSockAddr,sizeof(struct sockaddr_in)) ; if ( ret == -1 ) { perror( "connect()" ); alarm(0); close(s); return 0; } }
alarm(0) ; printf( "Connect reussi : %s sur port %d\n",iphost,port ) ; return s ; }
int scan_proxy_http(char *ip) { int i = 0; char *port[] = { "80" , "8080" , "3128" , "8001" , "8002" , NULL};
/* Scan for HTTP proxy */ while(port[i]) { printf("tentative sur %s %s\n",ip,port[i]); int s = check_connect(ip,atoi(port[i++])); if(s > 0) printf("connecté\n"); } }
le timeout fonctionne sur le ports 80 , ne fonctionne pas sur le 8080 , et fonctionne sur les trois suivant
y'a rien a comprendre lol
|
|
jeudi 3 mai 2007 à 12:29:03 |
Re : time sur socket en C

emmatopiak
|
Salut,
Deja ton code est tres bien fait c'est tres agreable a lire, maintenant pour ton probleme je ne sais pas pour le moment. -Peux-tu me dire : 1) l'etat de tous les ports que tu testes 2) ce que renvoie connect quand il marche 3) ce que tu entends par 'le timeout ne marche pas' => est-ce que tu veux dire que tu dois attendre les trois minutes ?
@++
|
|
jeudi 3 mai 2007 à 14:18:33 |
Re : time sur socket en C

yohan49
|
je vais te pondre un petit prog separe pour tester tout cela et afficher les duree avant timeout
je vous l'afficherais apres
a dans une heure
|
|
jeudi 3 mai 2007 à 16:08:41 |
Re : time sur socket en C

yohan49
|
#include <sys/types.h> #include <sys/socket.h> #include <sys/select.h> #include <sys/time.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <arpa/inet.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include <time.h>
/* ip a tester */ char *ip_test = "86.204.130.181";
/* variable d'enregistrement de l'environnement pour restauration de l'environnement apres un timeout **/ jmp_buf timeout_jump ;
/* fonction a traiter sur SIGALRM */ void timeout(int sig) { printf("dans la fonction timeout , restauration de l'environnement\n"); longjmp( timeout_jump, 1 ) ; return; }
/* return 0 si erreur ou superrieur a 0 si reussi **/ int creat_socket() { int s = -1;
if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) return 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, 0, 0); setsockopt(s, SOL_SOCKET, SO_REUSEADDR, 0, 0); setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
return s ; }
/* fonction de test de connection iphost / port */ int is_con_possible(int s,char *iphost,int port) { struct hostent *serverHostEnt; struct sockaddr_in serverSockAddr; long hostAddr; int ret = 0;
memset(&serverSockAddr, 0, sizeof(struct sockaddr_in));
memset(&serverSockAddr, 0, sizeof(serverSockAddr)); hostAddr = inet_addr(iphost); if ( (long)hostAddr != (long)-1) memcpy(&serverSockAddr.sin_addr, &hostAddr, sizeof(hostAddr)); else { serverHostEnt = gethostbyname(iphost); if(!serverHostEnt) return 0;
memcpy(&serverSockAddr.sin_addr, serverHostEnt->h_addr, serverHostEnt->h_length); } serverSockAddr.sin_family = AF_INET; serverSockAddr.sin_port = htons(port);
// on arme le timeout signal( SIGALRM, timeout ) ; alarm( 5 ) ;
if ( setjmp( timeout_jump ) == 1 ) { printf( "C'est un timeout\n") ; close(s); alarm(0); return 0; } else { ret = connect(s,(struct sockaddr *)&serverSockAddr,sizeof(struct sockaddr_in)) ; if ( ret == -1 ) { perror( "connect()" ); alarm(0); close(s); return 0; } } alarm(0) ; printf( "Connect reussi\n") ; return 1; }
int scan_proxy_http(char *ip) { int i = 0; char *port[] = { "8080" , "80" , "3128" , "8001" , "8002" , NULL};
time_t d,f;
/* Scan for HTTP proxy */ while(port[i]) { time(&d);
printf("\n\ntentative sur %s %s\n",ip,port[i]);
/* creation de la socket */ int s = creat_socket(); if(s > 0) { printf("socket cree\n");
// on arme le timeout if(is_con_possible(s,ip,atoi(port[i++]))) { printf("la connection a reussi\n");
/* fermeture du socket */ close(s); } }
time(&f); printf("temps ecoule %ld seconde(s)\n",f-d); } return 0; }
int main(void) { printf("Lancement du test sur l'ip : %s!\n",ip_test); scan_proxy_http(ip_test); return 0; }
ET LE RESULTAT :
Lancement du test sur l'ip : 86.204.130.181!
tentative sur 86.204.130.181 8080 socket cree dans la fonction timeout , restauration de l'environnement C'est un timeout temps ecoule 5 seconde(s)
tentative sur 86.204.130.181 80 socket cree connect(): Connection timed out temps ecoule 189 seconde(s)
tentative sur 86.204.130.181 3128 socket cree connect(): Connection refused temps ecoule 1 seconde(s)
tentative sur 86.204.130.181 8001 socket cree connect(): Connection timed out temps ecoule 189 seconde(s)
tentative sur 86.204.130.181 8002 socket cree connect(): Connection timed out temps ecoule 189 seconde(s)
Mon time out ne fonctionne qu'une seul fois :///
bien bizard ca quand meme
je pense que je vais devoir passer en non-bloquant , les stocker dans une liste chainée , puis creer une liste de timer qui ira toute les secondes voir si un socket est dispo en lecture
|
|
jeudi 3 mai 2007 à 18:00:17 |
Re : time sur socket en C

yohan49
|
voici maintenant en socket non bloquand ! fonctionne bien mieu
#include <sys/types.h> #include <sys/socket.h> #include <sys/select.h> #include <sys/time.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <arpa/inet.h> #include <signal.h> #include <errno.h> #include <time.h>
/* ip a tester */ char *ip_test = "86.204.130.181";
int Sock_SetBlockMode (int sock, int blocking) { int flags; int r; flags = fcntl (sock, F_GETFL); if (blocking == 1) r = fcntl (sock, F_SETFL, flags & ~O_NONBLOCK); else r = fcntl (sock, F_SETFL, flags | O_NONBLOCK); return r; }
/* return 0 si erreur ou superrieur a 0 si reussi **/ int creat_socket() { int s = -1;
if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) return 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, 0, 0); setsockopt(s, SOL_SOCKET, SO_REUSEADDR, 0, 0); setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
return s ; }
/* fonction de connection iphost / port */ int connection(int s,char *iphost,int port) { struct hostent *serverHostEnt; struct sockaddr_in serverSockAddr; long hostAddr;
memset(&serverSockAddr, 0, sizeof(struct sockaddr_in));
memset(&serverSockAddr, 0, sizeof(serverSockAddr)); hostAddr = inet_addr(iphost); if ( (long)hostAddr != (long)-1) memcpy(&serverSockAddr.sin_addr, &hostAddr, sizeof(hostAddr)); else { serverHostEnt = gethostbyname(iphost); if(!serverHostEnt) return 0;
memcpy(&serverSockAddr.sin_addr, serverHostEnt->h_addr, serverHostEnt->h_length); } serverSockAddr.sin_family = AF_INET; serverSockAddr.sin_port = htons(port);
Sock_SetBlockMode(s,0);
connect(s,(struct sockaddr *)&serverSockAddr,sizeof(struct sockaddr_in)) ;
return s; }
/* test si le socket est pret en lecture */ int proxy_test(int s) { fd_set fds; struct timeval tv;
FD_ZERO(&fds); FD_SET(s, &fds);
tv.tv_sec = 5; tv.tv_usec = 0;
if(select(s+1, &fds, NULL, NULL, &tv) > 0) return s; return -1; }
/* reception des donnees */ int proxy_read(int s, char *buf, size_t buflen) { fd_set fds; struct timeval tv;
FD_ZERO(&fds); FD_SET(s, &fds);
tv.tv_sec = 5; tv.tv_usec = 0;
if(select(s+1, &fds, NULL, NULL, &tv) > 0) return recv(s, buf, buflen, 0); return -1; }
int scan_proxy_http(char *ip) { int i = 0; char *port[] = { "8080" , "80" , "3128" , "8001" , "8002" , NULL};
time_t d,f;
/* Scan for HTTP proxy */ while(port[i]) { time(&d);
printf("\n\ntentative sur %s %s\n",ip,port[i]);
/* creation de la socket */ int s = creat_socket(); if(s > 0) { connection(s,ip,atoi(port[i++])); /** test si le socket est pret **/ if(proxy_test(s) != -1) { char buf[256];
printf("la connection a reussi\n"); proxy_read(s, buf, 256);
printf("recus :%s\n",buf); } else { printf("la connection a echoue\n"); } /* fermeture du socket */ close(s); }
time(&f); printf("temps ecoule %ld seconde(s)\n",f-d); } return 0; }
int main(void) { printf("Lancement du test sur l'ip : %s!\n",ip_test); scan_proxy_http(ip_test); return 0; }
ET LE RESULTAT :
Lancement du test sur l'ip : 86.204.130.181!
tentative sur 86.204.130.181 8080 la connection a echoue temps ecoule 5 seconde(s)
tentative sur 86.204.130.181 80 la connection a echoue temps ecoule 5 seconde(s)
tentative sur 86.204.130.181 3128 la connection a reussi recus : temps ecoule 0 seconde(s)
tentative sur 86.204.130.181 8001 la connection a echoue temps ecoule 5 seconde(s)
tentative sur 86.204.130.181 8002 la connection a echoue temps ecoule 5 seconde(s)
|
|
Cette discussion est classée dans : minutes, socket, time, ports, timeout
Répondre à ce message
Sujets en rapport avec ce message
Timeout et Socket [ par epoc ]
Est-ce que qqun sait comment gérer un timeout sur un socket? (Sans passer par un timer si possible.)Merci :-D
socket: recv + timeout ??? [ par oliverman ]
Salut tt le monde, En fait mon probleme, c'est que je voudrais utiliser un timeout avec la fonction recv. Est ce qu'il ya une fonction similaire qui p
faire un timeout avec une socket TCP sur un connect() [ par bobijoe ]
Salut tout le monde,ca fait pas mal de temps que je me lutte pour faire un timeout sur une demande de connexion TCP.En clair je voudrais pouvoir arret
Timeout pour Socket [ par Oeil_de_taupe ]
Bonjour les programmeurs, Je suis en train de créer une DLL pour rechercher des email sur un serveur POP3. Pour l'instant ma DLL ne fait que loguer
(SOCKET) Tester si des ports TCP sont libres [ par supergrey ]
Voila pour mon programme qui utilise les sockets j'ai besoin de 3 ports libres, de préférence consécutifs, pour se connecter à 3 serveurs.Doncje voudr
[C] Un timeOut sur Socket en détails [Linux] [ par ZedMaTrix ]
Salut a tous.Bon j'ai pas mal cherché sur le site, et appart des débuts de réponses, je n'ai rien trouvé qui m'ai aidé à résoudre ce problème de TimeO
Socket avec Time out sous windows [ par ghanmi04_05 ]
Bonjour, J'ai un programme qui intercept les paquets sur une ip(de l'une de mes cartes réseaux) sous windows. [code=cpp] SOCKET sock; if((sock = s
Socket Time-Out [ par malik7934 ]
Visiblement je vais jamais m'en sortir avec ces sockets... once again, one question:Je veux que mon serveur arrête d'écouter après 5 secondes s'il n'a
Ré-initialiser un programme avec socket [ par malik7934 ]
socket ... tu auras ma peau!Hello! C'est moi la maxi- pine des sockets!Voici mon x'ème problème: dans mon prog, lorsque je clique sur un bouton (IDC_L
socket... trop speed! [ par malik7934 ]
Hello,Au risque de me faire taper sur les doigts par aardman (aïe!), je m'aventure à poser une nième question sur les sockets!Mon prog a un client et
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : CXIMAGERE : CXIMAGE par rt15
Cliquez pour lire la suite par rt15
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|