Lire un fichier web en C++ avec wxWidgets - C++ - Programmation
Marsh Posté le 29-07-2005 à 23:20:58
Salut,
Essaye de pinger le serveur ou est situe la page tu sauras si il est up.
Pour le time out mets une tampo apres la demande d'acces au site.
Marsh Posté le 04-10-2004 à 14:41:42
Bonjour,
J'ai écrit une fonction en C++ avec wxWidgets pour récupérer une page Web. Mon problème, c'est que la lecture d'un ensemble de fichiers est fortement ralentie par des serveurs down ou très lents / surchargés. La fonction passe alors son temps à attendre. Je souhaiterai donc pouvoir mettre un time out à la lecture du fichier ou à défaut ajouter une fonction préalable qui teste l'accessibilité de la page à récupérer.
Par contre je ne vois pas du tout comment faire.
Quelqu'un peut-il m'éclairer ?
Merci d'avance pour les idées : le code source actuel est en dessous.
RV.
bool readflux (wxString filename, wxString *filecontent)
{
wxInputStream *in_stream = NULL;
int ReadMode = 1;
// DEBUT LECTURE DU FICHIER DISTANT
filename = wxURL::ConvertToValidURI( filename );
wxURL url(filename);
if ( url.GetError() != wxURL_NOERR )
{
// erreur : problème lors de l'analyse de l'URL
return false;
}
wxChar *data = NULL;
size_t size = 0;
try
{
// essai pour ouvrir le flux
in_stream = url.GetInputStream();
}
catch (...)
{
// erreur : problème à l'ouverture du flux RSS.
return false;
}
//////////////////////////////////////////////////
if ( in_stream )
{
// le fichier distant a pu être ouvert
try
{
size = in_stream->StreamSize();
}
catch (...)
{
// erreur : la demande de la taille du fichier a causé une erreur.
ReadMode = 2;
}
}
else
{
// le fichier distant n'a pas pu être ouvert
return false;
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// certains fichiers http renvoient leur taille => on passe par Read
// d'autres renvoient -1 => on passe par GetC (ce est plus lent)
if ((int)size > 0)
ReadMode = 1;
else
ReadMode = 2;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
wxString temp;
if (ReadMode==1)
{
if (size > 0)
try
{
data = new wxChar[size];
}
catch (...)
{
// erreur : la création du conteneur a échoué
return false;
}
else
{
// le fichier est de taille nulle ou indéterminée.
return false;
}
try
{
// essai de lire dans le flux
if (!in_stream->Read(data, size))
{
// la lecture du fichier distant a échoué
if (in_stream) delete in_stream;
if (data) delete data;
return false;
}
else
{
wxString _data (data, size);
temp = _data;
// la lecture du fichier distant a réussi
}
}
catch (...)
{
if (in_stream) delete in_stream;
if (data) delete data;
return false;
}
}
else
{
try
{
char c; size = 0;
do
{
c=in_stream->GetC();
size++;
temp.Append (c);
}
while (in_stream->LastRead()>0);
}
catch (...)
{
// erreur a la lecture du fichier caractere par caractere
if (in_stream) delete in_stream;
if (data) delete data;
return false;
}
}
// liberation memoire
if (in_stream) delete in_stream;
if (data) delete data;
// FIN LECTURE FICHIER DISTANT
*filecontent = temp;
return true;
}
Cordialement.