Bonjour à tous !


Actuellement je suis sur un projet, je code un "genre" de ftp.
L'intérêt c'est l'architecture. la partie serveur est en fait le client (socket) et vice-versa.
Ainsi je peux dialoguer avec des machines derrière des pare-feu (et/ou certains proxys).
Si la connexion échoue (quand le programme serveur n'est pas en écoute), le client tentera une reconnexion plus tard

Le problème, c'est les erreurs.

Comment gérer les déconnexions intempestives, et surtout les reconnections ?
Lorsque je fait WSAgetLastError je tombe le plus souvent sur :


=> erreur 10053 soit WSAECONNABORTED: (msdn)

Software caused connection abort.

An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error.
lors des deconnexions intempestives


=> erreur 10093 soit WSANOTINITIALISED : (msdn)

Successful WSAStartup not yet performed.

Either the application has not called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times.





Dans ce dernier cas je ne comprend pas car la déclaration WSAstartup est bien faite dans le constructeur et j'obtiens cette erreur durant l'envoi de donnees...


Je tiens à préciser que j'obtiens plus souvent des erreurs sous Seven que dans des version antérieure de windows (Window 2000)
Je ne suis pas un expert Windows, si quelqu'un pouvait m'orienter sur les socket Windows et la gestion des reconnexions.

Voici le code de ma methode et du constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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
Link::Link()
{
    lastNbreByteRecv = 0;
    lastNbreByteSend = 0;
    sock_err = 0;
    erreur = WSAStartup(MAKEWORD(2, 2), &WSAData);
 
}
 
 
bool Link::masterLinkEstablish()
{
    bool success = false;
 
    IN_ADDR Adresse;
    HOSTENT * ipAdress = NULL;
 
 
    try
    {
        if (!erreur)
        {
            if( (connection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET )
            {
                if ((ipAdress = gethostbyname(DNSOFMASTER)) != NULL)
                {
                    if (memcpy(&Adresse, ipAdress -> h_addr, ipAdress -> h_length) != NULL)
                    {
                        param.sin_family = AF_INET;
                        param.sin_port = htons(PORTOFMASTER);
                        param.sin_addr = Adresse;
 
                        if((sock_err = connect(connection, (SOCKADDR *)&param, sizeof(param))) != SOCKET_ERROR)
                        {
                            success  = true;
                        }
                    }
                }
            }
        }
    }
    catch (int e)
    {
        sock_err = 0;
        lastNbreByteRecv = 0;
        lastNbreByteSend = 0;
 
    }
 
    return success;
}
Merci beaucoup à tous ceux qui liront ce sujet

Vendreday