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:
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.