yohan49
Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
3 mai 2007 à 18:00
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
#include <stdlib.h>
#include <fcntl.h>
#include
#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)