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 Delphi Discussion :

Erreur socket asynchrone 10053


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut Erreur socket asynchrone 10053
    Bonjour,

    J'utilise actuellement deux applications, un client WindevMobile et un serveur de socket en Delphi.
    Mon utilisateur se connecte sur l'application cliente cela envoi une trame de connexion à la socket qui permet à l'utilisateur de se connecter. Là si jamais une mise à jour de mon application cliente est disponible je récupère cette mise à jour, pour cela je déconnecte mon utilisateur, je déconnecte ma socket et je lance ma récupération (via une autre appli). Une fois l'application récupérée celle ci redémarre et mon utilisateur peut à nouveau se connecter...
    Cependant au moment de la déconnexion (juste après j'ai l'impression) j'ai une erreur socket asynchrone 10053... je ne sais pas comment l'éviter parce que si je continue sur la compilation cela ne plante pas mon programme tout fonctionne...

    Voici mon code de déconnexion :

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    procedure TMainForm.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
    sCodeRecu, sMessageRecu, addIP, codeUser, codeDep, articleReappro, typeReappro, codeTournee, numCmd, numColis, codeRegroup, typeEclatement  : String;
    codeValidExpe, chariot, mpl, adr, adrAncien, sCptxcol : string;
    idConnect, bonxtrn, typeRejet, ordre, qte, nbscans, rupture, prep, nbErreur : integer;
    aLitSocket : TStringList;
    tabRecupSocket : TStringDynArray;
    sMessageType, sModule, sAction, sRaison, sQuantite : string;
    sNumVersion, ligne, lot, cp1, toucheF5, module, sRef : String;
    EstUnCodeSSCC : boolean;
     
     
    type
      TMsgType = (MSG_US00, MSG_US99, MSG_CB01, MSG_CR01, MSG_CR02, MSG_CR03, MSG_CR05, MSG_CC02, MSG_CC03, MSG_CC04 , MSG_CC05, MSG_CI01, MSG_CI02, MSG_CI03, MSG_CI05, MSG_CI06, MSG_CI07, MSG_CI08, MSG_CI09, MSG_CI10, MSG_SI02, MSG_SI03, MSG_SI05, MSG_SI06, MSG_SI07, MSG_SI08, MSG_SI09, MSG_CT02, MSG_CT03, MSG_CT04, MSG_CT05, MSG_CT06, MSG_CT07, MSG_CD02, MSG_CD03, MSG_CD04, MSG_CD05, MSG_CD06, MSG_CD07, MSG_CD08, MSG_CD09, MSG_CD10, MSG_CD11, MSG_CD12, MSG_PL02, MSG_SC02, MSG_SC04, MSG_SC05, MSG_SC06, MSG_SC07, MSG_SC08, MSG_SC09, MSG_SC10, MSg_SC11, MSG_SC12);
    const
      MSG_TYPE : array[TMsgType] of string = ('US00#', 'US99#', 'CB01#', 'CR01#', 'CR02#', 'CR03#', 'CR05#', 'CC02#', 'CC03#', 'CC04#', 'CC05#', 'CI01#', 'CI02#', 'CI03#', 'CI05#', 'CI06#', 'CI07#', 'CI08#', 'CI09#', 'CI10#', 'SI02#', 'SI03#', 'SI05#', 'SI06#', 'SI07#', 'SI08#', 'SI09#', 'CT02#', 'CT03#', 'CT04#','CT05#', 'CT06#', 'CT07#', 'CD02#', 'CD03#', 'CD04#', 'CD05#', 'CD06#', 'CD07#', 'CD08#', 'CD09#', 'CD10#', 'CD11#', 'CD12#', 'PL02#', 'SC02#', 'SC04#', 'SC05#', 'SC06#', 'SC07#', 'SC08#', 'SC09#', 'SC10#', 'SC11#', 'SC12#');
     
     
    begin
    idConnect := -1;
    nbErreur := 0;
    aLitSocket := TStringList.Create;
    EstUnCodeSSCC := False;
     
    sMessageRecu := '';
    sCodeRecu := '';
    codeUser := '';
    codeDep := '';
    articleReappro :='';
    typeReappro := '';
    bonxtrn := -1;
    codeTournee := '';
    numCmd := '';
    numColis := '';
    codeRegroup := '';
    codeValidExpe := '';
    typeEclatement := '';
    ligne := '';
    lot := '';
    rupture := -1;
    cp1 := '';
    toucheF5 := '';
    module := '';
    chariot := '';
    mpl := '';
    prep := -1;
    adr := '';
    adrAncien := '';
    sCptxcol := '';
    sMessageType := '';
    sModule := '';
    sAction := '';
    sRef := '';
    sRaison := '';
    sQuantite := '';
     
    try
      // Tant que je ne trouve pas un # indiquant la fin du code barre, je boucle...
      While Pos('#', sMessageRecu) = 0 do
        begin
        sMessageRecu := Socket.ReceiveText;
        WriteCodeBarre(maDate + ' : Message reçu : ' + sMessageRecu);
     
        // On vérifie que le message reçu ne soit pas vide
        if sMessageRecu = '' then
          exit; //On termine la procédure si on a pas de code barre
     
        // Je remplace les CRLF (=Retour Chariot RC sous WinDev) par des ;
        sMessageRecu := StringReplace(sMessageRecu, CRLF, ';', [rfReplaceAll]);
     
        //Je sépare ma chaine à chaque ;
        ExplodeLazy(sMessageRecu, tabRecupSocket, ';');
     
        {*Ma chaine est de la forme :
        Soit sur un Intermec TailleSocket + TailleCodeBarre + CodeBarre
        Soit sur un PSION TailleCodeBarre + CodeBarre
        Pour ne pas avoir d'erreur je récupère ma TailleCodeBarre qui est toujours en avant dernière position...*}
     
        addIP := Socket.RemoteAddress;
        idConnect := Socket.SocketHandle;
        idConnexion := idConnect;
     
        // Récupération et stockage de l'identifiant de connexion en DB
        oqInsertIdConnexion.Close;
        oqInsertIdConnexion.SQL.Clear;
        oqInsertIdConnexion.SQL.Add('UPDATE adresseip SET idconnexion = :monIdConnexion WHERE adrip = :addIP');
        oqInsertIdConnexion.DeclareAndSet('monIdConnexion', otString, idConnexion);
        oqInsertIdConnexion.DeclareAndSet('addIP', otString, addIP);
        oqInsertIdConnexion.Execute;
        oqInsertIdConnexion.Session.Commit;
     
        // Je vérifie que je reçois bien une valeur pour continuer le traitement
        if Length(tabRecupSocket) >= 2 then
        begin
          sMessageType := tabRecupSocket[Length(tabRecupSocket)-2] + tabRecupSocket[Length(tabRecupSocket)-1];
     
          //Selon le type message reçu je fais le traitement adéquat
          case TMsgType(AnsiIndexText(sMessageType, MSG_TYPE)) of
    // ----------------------------------------------------------------US : Module utilisateur-------------------------
            MSG_US00 : begin          // Connexion utilisateur
                        sCodeRecu := tabRecupSocket[Length(tabRecupSocket)-3];
                        sNumVersion := tabRecupSocket[Length(tabRecupSocket)-4];
                        sModule := tabRecupSocket[Length(tabRecupSocket)-2];
                        sAction := MidStr(tabRecupSocket[Length(tabRecupSocket)-1],1,2);
                        ControleUser(addIP, sCodeRecu, sNumVersion, sModule, sAction, ServerSocket, oqRechercheNomScan, OracleSession, idConnect, oqAddUser);              end;
            MSG_US99 : begin          // Déconnexion utilisateur
                        sCodeRecu := tabRecupSocket[Length(tabRecupSocket)-3];
                        sModule := tabRecupSocket[Length(tabRecupSocket)-2];
                        sAction := MidStr(tabRecupSocket[Length(tabRecupSocket)-1],1,2);
                        SortirProgramme(addIP, sCodeRecu, sModule, sAction, ServerSocket, OracleSession, idConnect);
                        maj_raoxres(sCodeRecu, addIP, sModule, sAction, '', '', '', '', '', 'Déconnexion de l''utilisateur', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 'N', 'N', 'N', 'S', OracleSession);
                       end;
    end;
        end;
        TraceServeur.Lines.Add(Socket.RemoteAddress + ' : ' + sMessageRecu);
        end;
    except
      on E : Exception do LogErreur('Anomalie ServerSocketClientRead - Main') ;
    end;
    end;
    Merci d'avance je ne sais pas comment faire...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 489
    Points : 24 966
    Points
    24 966
    Par défaut
    Windows Sockets Error Codes

    Citation Envoyé par msdn
    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.
    En même temps, c'est un peu normal, si tu interromps la connexion !
    Delphi qui déconnecte brutalement Windev, normal qu'il soit informé !

    Ensuite déconnecté un Client durant son OnRead, c'est évidemment retord !
    Ne t'avais-je pas déjà dit de ne mettre que le minimum dans le OnRead et d'utiliser un TThread et une TThreadList pour déporter les traitements !
    Tu n'auras ainsi plus ce problème !

    tu n'as pas fourni le code de déconnexion, serait-ce cacher dans SortirProgramme ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Oui excuse moi voici le code de déconnexion :

    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
    {Procédure appelée car l'utilisateur sort du programme Windev il faut alors supprimer le code user dans la table PRPXRES}
    procedure SortirProgramme(addIP : string; codeUser : string; sMod : string; sAct : string; ServerSo : TServerSocket; SessionO : TOracleSession; idConnect : integer);
    var
      reqDeletePrp : TOracleQuery;
    begin
    reqDeletePrp:=TOracleQuery.Create(Nil);
    reqDeletePrp.Session := SessionO;
      Try
        reqDeletePrp.Close;
        reqDeletePrp.SQL.Clear;
        reqDeletePrp.SQL.Add('delete from PRPXRES where CODXPRP=:code');
        reqDeletePrp.DeclareAndSet('code', otString, codeUser);
        reqDeletePrp.Execute;
        reqDeletePrp.Session.Commit;
        if reqDeletePrp.RowCount = 0 then
          begin
          // A vérifier si nécessaire !
         // envoiMsgSocket(idConnect, 'Erreur', uppercase('PBPRPXRES'), ServerSo);
          end
        else
          begin
          envoiMsgSocket(idConnect, 'Ok', uppercase('OKPRPXRES'), ServerSo);
          end;
      Finally
        reqDeletePrp.Close; reqDeletePrp.Free;
      End;
    end;
    Ben je déconnecte pas brutalement, j'envoi une trame qui exécute la fonction SortirProgramme...
    Et je déconnecte ma socket également juste après...
    Windows XP
    Delphi 7

    WinDev Mobile 17

Discussions similaires

  1. [Débutant] Ne pas afficher "Erreur socket asynchrone 10061"
    Par SmallFitz dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/12/2011, 23h36
  2. Erreur socket asynchrone
    Par Hellgast dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/11/2009, 11h29
  3. Erreur Socket Asynchrone 10053
    Par QAYS dans le forum Delphi
    Réponses: 2
    Dernier message: 16/06/2006, 07h44
  4. connexion socket asynchrone
    Par jagboys dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2005, 17h04
  5. SQL Server: Java Erreur Socket
    Par BenoitM dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2003, 16h32

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