Socket : vérifier un proxy
	
	
		Bonjour,
J'ai esseyer de faire un script qui vérifie si un proxy fonctionne ou non:
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 
 | #include <iostream>
#include <winsock2.h>
#include <fcntl.h>
#include <sys/fcntl.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
 
int main(){
	WSADATA WSAData;
	WSAStartup(MAKEWORD(2,0), &WSAData);
	SOCKET sock;
	SOCKADDR_IN sin;
	unsigned long nonblocking=1;
 
	sin.sin_addr.s_addr	= inet_addr("195.175.37.8"); 
	sin.sin_family		= AF_INET;
	sin.sin_port		= htons(80);
	sock = socket(AF_INET,SOCK_STREAM,0);
 
    /* LINUX: */
    //fcntl (sock, F_SETFL, O_NONBLOCK);                                    
    /* WINDOWS: */
    if(ioctlsocket(sock, FIONBIO, &nonblocking)<0){
		cout<<WSAGetLastError()<<endl;
		cerr<<"La socket ne peut être rendu non-bloquante"<<endl;
        cerr<<"On continue quand même avec socket bloquante. Patience."<<endl;
    }
 
	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
	if(WSAGetLastError()!=WSAEWOULDBLOCK){ // LINUX : EINPROGRESS
		cout<<"Erreur 0: "<<WSAGetLastError()<<endl;
        exit(1);
    }else{
		fd_set readfds;
		FD_ZERO(&readfds);
		FD_SET(sock, &readfds); 
		struct timeval tv;
		tv.tv_sec = 2;
		tv.tv_usec = 500*1000;
		int r;
 
		if((r=select(sock+1, &readfds, NULL, NULL, &tv))<0){
			cout<<"Erreur 1: "<<WSAGetLastError()<<endl;
			exit(1);
		}else if(r==0){
			cout<<"Erreur 2: "<<WSAGetLastError()<<endl;
			exit(1);
		}else{
			cout<<"Le proxy a répondu favorablement. Tout semble ok."<<endl; 
		}
	}
 
	WSACleanup();
	return 0;
} | 
 Même si je donne à mon script une ip de proxy, il m'affiche toujours: "Erreur 2: 0", pourquoi ?
Merci d'avance...
	 
	
	
	
		Re: Socket : vérifier un proxy
	
	
		
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 
 | #include <iostream>
#include <winsock2.h>
#include <fcntl.h>
#include <sys/fcntl.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
 
int main()
{
    /* Correction : Utilise la version 2,2 ;) */
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,2), &WSAData);
 
    SOCKET sock;
    SOCKADDR_IN sin;
    unsigned long nonblocking = 1;
 
    sin.sin_family		= AF_INET;
    sin.sin_addr.s_addr     = inet_addr("195.175.37.8"); 
    sin.sin_port		 = htons(80);
 
    sock = socket(PF_INET, SOCK_STREAM, 0);
 
    /* LINUX: */
    //fcntl (sock, F_SETFL, O_NONBLOCK);    
 
    /* WINDOWS: */
    if(ioctlsocket(sock, FIONBIO, &nonblocking)<0)
    {
        cout << WSAGetLastError() << endl;
        cerr << "La socket ne peut être rendu non-bloquante" << endl;
        cerr << "On continue quand même avec socket bloquante. Patience." <<endl;
    }
 
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
 
    if(WSAGetLastError() != WSAEWOULDBLOCK)
    { // LINUX : EINPROGRESS
        cout<<"Erreur 0: "<<WSAGetLastError()<<endl;
        exit(1);
    }
    else
    {
        fd_set readfds;
 
        FD_ZERO(&readfds);
        FD_SET(sock, &readfds); 
 
        struct timeval tv;
        tv.tv_sec = 2;
        tv.tv_usec = 500*1000;
        int r;
 
        r=select(sock+1, &readfds, NULL, NULL, &tv);
 
        if(r<0)
        {
            cout << "Erreur 1: "<< WSAGetLastError() << endl;
            exit(1);
        }
        else if(r==0)
        {
            cout << "Erreur 2: "<< WSAGetLastError() << endl;
            exit(1);
        }
        else
        {
            cout<<"Le proxy a répondu favorablement. Tout semble ok."<<endl; 
        }
    }
 
    WSACleanup();
 
    return 0;
} | 
 C'est un peu plus clair comme ça...
Donc je te conseille de vérifier les valeurs retournées par tes fonctions, comme socket(), connect(), etc... 
Apparament le problème viendrait de select() qui renvoie 0.. mais je connais pas trop cette fonction :(
	 
	
	
	
		Re: Socket : vérifier un proxy
	
	
		
	Citation:
	
		
		
			
				Envoyé par Freed0
				
			
			Apparament le problème viendrait de select() qui renvoie 0.. mais je connais pas trop cette fonction :(
			
		
	 
 http://www.google.fr/search?hl=fr&q=man+select
http://www.linux-france.org/article/man-fr/man2/select-2.html
	Citation:
	
		
		
			VALEUR RENVOYÉE
       En cas de réussite select renvoie le  nombre  de  descrip*
       teurs dans les ensembles, qui peut être nul si le délai de
       timeout a expiré avant que quoi que ce soit  d'intéressant
       ne  se  produise.   select retourne -1 s'il échoue, auquel
       cas errno contient le code d'erreur.
			
		
	
 
	Code:
	
    cout<<"Le proxy a répondu favorablement. Tout semble ok."<<endl;
 J'ai une question : le serveur est censé avoir répondu à quel message ?