IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Erreur 10053 sur un recv();


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Erreur 10053 sur un recv();
    Bonjour !

    Je ne comprend pas pourquoi mon programme ne peut pas lire sur un socket TCP, il me retourne l'erreur 10053.


    nb: Mon pare-feu sous windows est desactivé!

    Voici le "visuel" de l'interaction entre le client (a droite, et le serveur auquel il se connecte (a gauche)




    Initialisation du serveur:
    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
     
        load_configuration();
        welcome();
     
        #if defined (WIN32)
        WSADATA WSAData;
        int error = WSAStartup(MAKEWORD(2,2), &WSAData);
        #else
        int error = 0;
        #endif
        int sock_err;
     
        if(error)
        {
            cout << "ERROR: WSAStartup" << endl;
            exit(0);
        }
        _server = socket(AF_INET, SOCK_STREAM, 0);
        if(_server == INVALID_SOCKET)
        {
            cout << "ERROR: INVALID_SOCKET" << endl;
            exit(0);
        }
        else {
            cout << "Socket is ready (TCP)" << endl;
        }
     
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
        sin.sin_family = AF_INET;
        sin.sin_port = htons(_config["port"].ival);
        sock_err = bind(_server, (SOCKADDR*) &sin, sizeof(sin));
        if(sock_err == SOCKET_ERROR)
        {
            cout << "ERROR: Binding socket" << endl;
            exit(0);
        }
        sock_err = listen(_server, 5);
        cout << "Socket is now listening on port " << _config["port"].ival << endl;
        FD_ZERO(&recvfs);
     
        pthread_create(&worker, NULL, Networker, this);

    Quand un client se connecte:
    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
     
        int one = sizeof(sin);
        while(true)
        {
            _incomingsocket = accept(_server, (struct sockaddr*)&sin, &one);
            if(_incomingsocket == SOCKET_ERROR)
            {
                //SDL_Delay(50);
                continue;
            }
            string ip = string();
            ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b1));
            ip += ".";
            ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b2));
            ip += ".";
            ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b3));
            ip += ".";
            ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b4));
            cout << "Client connected (IP: " << ip << "; sock: " << _incomingsocket << ")" << endl;
     
            FD_SET(_incomingsocket, &recvfs);
            register_session(create_session(ip, _incomingsocket));
            if(_incomingsocket > _maxfd)
            {
                _maxfd = _incomingsocket;
            }
        }
    Le thread qui qui les socket:
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    void* Networker(void* ptr)
    {
        ServerSocket* Master = reinterpret_cast<ServerSocket*>(ptr);
        int socketactivity;
        int sleep = 0, plength, i;
        uint16_t header;
        Packet packet;
        struct timeval tv;
    	fd_set mask;
     
        Buffer = new char;
        int BytesReceived = 0;
     
        cout << "Thread Networker is now up and running" << endl;
        setup_callbacks();
        cout << "Callbacks ready" << endl;
     
        bool shutdown = false;
        while(!shutdown)
        {
            if(select(Master->maxfd(), &Master->GetSocketSet(), NULL, NULL, NULL) < 0)
            {
                continue; // erreur ?
            }
            for(auto itr = Master->Clients().begin(); itr != Master->Clients().end(); ++itr)
            {
                if(!FD_ISSET(itr->second.GetSocket(), &Master->GetSocketSet()))
                {
                    continue; // rien ne se passe
                }
                // recv: 5 premiers bytes
                Receive(itr->second.GetSocket(), 5);
                cout << "Received from " << itr->second.GetSocket() << ": (" << BytesReceived << ") " << Buffer << endl;
                plength = lexical_cast<int>(Buffer);
                cout << "packet length = " << plength << endl;
                if(plength == -1)
                {
     
                }
                else if(plength == 0)
                {
                    Master->ClientDisconnection(itr->first);
                }
                else
                {
                    // recv: packet
                    Receive(itr->second.GetSocket(), plength);
                    packet = Packet(Buffer);
                    cout << "Received: " << Buffer << endl;
                    clearBuffer();
                    // get header
                    header = packet.ReadInt<uint8_t>();
                    // now, who is this socket ?
                    if(itr->second.GetType() == sessiontype::unknown)
                    {
                        if(callback_unknown[header] != NULL)
                        {
                            callback_unknown[header](itr->second, packet);
                        }
                    }
                }
                FD_CLR(itr->second.GetSocket(), &Master->GetSocketSet());
            }
        }
    }
     
    void Receive(const TCPsocket& sock, const int length)
    {
        clearBuffer();
        BytesReceived = 0;
        int t = 0;
        cout << "Trying to receive on socket: " << sock << " ; l=" << length << endl;
        while (true) {
            if (BytesReceived == length) break;
            t = recv(sock, (Buffer + BytesReceived), length - BytesReceived, 0x00);
            cout << "received " << t << " bytes ; buffer= " << Buffer << endl;
            BytesReceived += t;
            if(t <= 0)
            {
                cout << "Error reading socket " << WSAGetLastError() << endl;
                break;
            }
        }
    }
    void clearBuffer()
    {
        Buffer = "";
    }

    Et coté client, voici connexion + envoie dun peu de données:
    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
     
     
        int _temp;
        #if defined __MINGW32__
        WSADATA _wsa;
        if (WSAStartup(MAKEWORD(2,2),&_wsa) < 0)
    	{
    		exit(EXIT_FAILURE);
    	}
    	#endif
    	if ((_sock = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
    	{
    		exit(EXIT_FAILURE);
    	}
    	_saddr.sin_family=AF_INET;
    _saddr.sin_addr.s_addr=inet_addr(ip);
        _saddr.sin_port=htons(port);
        if(connect(_sock,(struct sockaddr*)&_saddr,sizeof(_saddr)) != 0)
        {
            cerr << "ERROR: Could not connect to " << ip << ":" << port << endl;
            exit(0);
        }
        cerr << "Connected to " << ip << endl;
     
        char* buf = new char;
        buf = "05 02 02\r\n";
        send(_sock, buf, strlen(buf), 0x00);


    Quelqu'un saurait m'expliquer d'où vient l'erreur ?

    merci, nico

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 150
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    j'ignore d'où peut provenir l'erreur, mais voilà ce qu'indique la MSDN à ce sujet:
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    WSAECONNABORTED
    10053
    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.
    Et un thread qui amène à cette page de résolution (?)
    http://support.ipswitch.com/kb/WSK-19980702-EM02.htm
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur 10035 sur recv()
    Par DakM dans le forum Débuter
    Réponses: 4
    Dernier message: 21/05/2012, 09h32
  2. Erreur 145 sur table mysql
    Par ramses83 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2007, 21h09
  3. [Kylix] erreur time.sur kylix avec redhat 9.0
    Par sumco dans le forum EDI
    Réponses: 4
    Dernier message: 20/05/2004, 15h13
  4. Réponses: 9
    Dernier message: 27/04/2004, 11h01
  5. [VB6] Erreur 9 sur redim preserve
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/10/2002, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo