Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : time sur socket en C [ Linux / Réseau & Internet ] (yohan49)

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

yohan49

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
#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

Membre Club
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)





1 2

Cette discussion est classé 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 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 Linux, C & Sockets [ par cbismuth ] Bonjour! Je pense devenir fou...Je programme actuellement une architecture serveur/client en C.Le problème est que pour tous les clients qui se conne


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.