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

C++Builder Discussion :

problème avec TWinSocketStream!


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut problème avec TWinSocketStream!
    Bonjour,
    j'ai un problème dans la lecture des réponses depuis un serveur(messages xml), ce problème est seulement dans le cas oû les messages sont de grande taille voici le code:

    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
    int i_ReadResponse( _di_IXMLDocument &l_o_ResponseDocXML)
    {
      // Function return value
      int l_i_Reply;
     
      //Response
      _di_IXMLDocument l_o_DocXML;
      TWinSocketStream *l_o_ResponseStream;
      char l_c_ResponseBuffer[BUFFERSIZE];
      bool l_b_ResponseWaited;
      long l_l_ResponseLength;
      AnsiString  l_str_XMLResponse; 
      long l_ul_XmlLength;
      int l_i_XmlErrorCode;
      int l_i_XmlErrorLineNumber; 
      int l_i_XmlErrorLinePos;
      DOMString l_o_XmlErrorReason;
      DOMString l_o_XmlErrorSrcTex;
      AnsiString l_str_ResponseCode;
      AnsiString l_str_ReponseMsg;
      AnsiString  l_str_Response;
     
      // Response recieving
      g_str_Message = g_str_Message + "---  channels Read Response ---" + AnsiString("\n");
     
      //Read Response 
      l_o_ResponseStream = new TWinSocketStream(g_ClientSocket_Dest->Socket,CLIENTWAITTIME);     
      memset(l_c_ResponseBuffer, 0, BUFFERSIZE); // initialize the buffer 
     
      //Give the server 60 seconds to start writing
      l_b_ResponseWaited = l_o_ResponseStream->WaitForData(CLIENTWAITTIME);      
     
      // Store Response
      if (l_b_ResponseWaited)
    	{
    	  if ((l_l_ResponseLength =l_o_ResponseStream->Read(l_c_ResponseBuffer,BUFFERSIZE))== 0) // if can't read in 60 seconds
    	    {
    	      g_ClientSocket_Dest->Socket->Close();           // close the connection
    	      l_i_Reply = -1;
    	    }
    	}
      else
        {
          g_ClientSocket_Dest->Socket->Close();      // if client doesn't start, close the socket and send error messgage(TimeOPut)
          g_str_Message = g_str_Message + "*** ! TimeOut, no response from MuxConfig Agent " + AnsiString("\n");
          l_i_Reply = -1;
        }
     
      // Response analysis
      l_str_XMLResponse = AnsiString(l_c_ResponseBuffer+4); 
     
      // Response length   
      l_ul_XmlLength = ((u_long)(((u_char *)l_c_ResponseBuffer)[0]))*0x1000000
        + ((u_long)(((u_char *)l_c_ResponseBuffer)[1]))*0x10000
        + ((u_long)(((u_char *)l_c_ResponseBuffer)[2]))*0x100
        + ((u_long)(((u_char *)l_c_ResponseBuffer)[3]));    
     
      //message length check
      l_l_ResponseLength =l_l_ResponseLength-4;
     
      if(l_l_ResponseLength < l_ul_XmlLength) 
        {
          g_str_Message = g_str_Message + "MuxConfig response is short, only "+ l_l_ResponseLength+ " bytes "
    	+  "are recieved, wait "+l_ul_XmlLength+ " bytes " + AnsiString("\n");
        }
      else if(l_l_ResponseLength > l_ul_XmlLength)
        {
          g_str_Message = g_str_Message + "MuxConfig response is long, "+  l_l_ResponseLength+ " bytes "
    	+  "are recieved, wait only "+l_ul_XmlLength + " bytes " + AnsiString("\n");
    	}
      else
        {     
          g_str_Message = g_str_Message+ "*** Recieve " +AnsiString(l_l_ResponseLength)+ " Bytes" +" (leng correct)" +AnsiString("\n");
        }  
     
     
     
      // Check if there is any error in XML format
      try
        {
          // response is stored in XMLDocument for parsing 
          l_o_DocXML = LoadXMLData(l_str_XMLResponse);
          l_o_DocXML->Active = true;
          l_o_DocXML->SaveToFile("server_to_client");
     
        }
      catch (EDOMParseError &e)
        {
    	  l_i_XmlErrorCode = e.EDOMParseError::ErrorCode;
    	  l_i_XmlErrorLineNumber = e.EDOMParseError::Line; 
    	  l_i_XmlErrorLinePos = e.EDOMParseError::LinePos;
    	  l_o_XmlErrorReason = e.EDOMParseError::Reason;
    	  l_o_XmlErrorSrcTex =e.EDOMParseError::SrcText;
    	  g_str_Message = g_str_Message + "*** ! "+ +e.Message.c_str()+ AnsiString("\n");     
    	  g_str_Message = g_str_Message + "*** ! EDOMParseError: An invalid charachter was found in XML file . Line:"
    	    + "[ " +AnsiString(l_i_XmlErrorLineNumber) + " ]" + " Position: "
    	    + "[ " +AnsiString(l_i_XmlErrorLinePos) +    " ]" + " at Text: " 
    	    + "[ " +AnsiString(l_o_XmlErrorSrcTex) +     " ]" + " The reason is: "
    	    + "[ " +AnsiString(l_o_XmlErrorReason) +     " ]" + " Error Code : "  
    	    + "[ " +AnsiString(l_i_XmlErrorCode ) +      " ]" +  AnsiString("\n");   
    	  l_i_Reply = -1;
        }
     
     
      // Out 
      l_o_ResponseDocXML =l_o_DocXML;
     
      // return
      return(l_i_Reply);
    }
    mais quand je change le traitement, je récupère caractère par caractère ca marche mais ca prend beaucoup de temps(60s a peut prés)

    merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Août 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 47
    Par défaut
    s'il vous plais est ce qu'il ya une solution ou pas?

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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