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);
} |
Partager