Problème dans l'utilisation du composant Stream Serveur - FastNet
Bonjourn
voici mon code qui est censé transférer un fichier bmp de A vers B, dans un réseau local.
je ne veux pas utilisé les composants Seveurs socket car j'ai des fichier de 500 ko, et envoie en boucle infinie (surveillance), et je n'ai pas trop de temp pour découper les fichier et les regrouper a la fin, j'ai besoin d'un composant simple qui fait le transfert, "sendfile".
une application a un client "NMStrm" et l'autre un serveur "NMStrmServer".
voici le code du client :
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
| //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TClient *Client;
//---------------------------------------------------------------------------
__fastcall TClient::TClient(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TClient::Button1Click(TObject *Sender)
{
TFileStream *MyFStream ;
// MyFStream = NULL ;
MyFStream = new TFileStream("stégané Photo 02-03-13-968.bmp", fmOpenRead);
NMStrm1->Port = 6711;
NMStrm1->Host= Edit1->Text;
NMStrm1->FromName= "salim";
//if ( (NMStrm1->PostIt(MyFStream) == "OK") ) { Memo1->Lines->Add("Fichier a été envoyé"); }
//else { Memo1->Lines->Add("Fichier non envoyé"); }
Memo1->Lines->Add("Status : " + (NMStrm1->PostIt(MyFStream)) );
delete MyFStream ;
}
//---------------------------------------------------------------------------
void __fastcall TClient::NMStrm1MessageSent(TObject *Sender)
{
Memo1->Lines->Add("Méssage a été envoyé");
}
//---------------------------------------------------------------------------
void __fastcall TClient::NMStrm1Connect(TObject *Sender)
{
Memo1->Lines->Add("connecté");
}
//---------------------------------------------------------------------------
void __fastcall TClient::NMStrm1ConnectionFailed(TObject *Sender)
{
ShowMessage ("Impossible de se connecter");
}
//---------------------------------------------------------------------------
void __fastcall TClient::NMStrm1Disconnect(TObject *Sender)
{
Memo1->Lines->Add("déconnecté");
}
//---------------------------------------------------------------------------
void __fastcall TClient::NMStrm1InvalidHost(bool &Handled)
{
Memo1->Lines->Add("adresse incorrecte");
} |
aucun problème jusqu'ici.
et voici le code du serveur :
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
| //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TServeur *Serveur;
int i = 0;
//---------------------------------------------------------------------------
__fastcall TServeur::TServeur(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TServeur::NMStrmServ1MSG(TComponent *Sender,
const AnsiString sFrom, TStream *strm)
{
Label1->Caption = sFrom;
/*TFileStream *MyFStream ;
i = i + 1 ;
MyFStream = NULL ;
MyFStream = new TFileStream("Photo 02-03-13-968 - " + String(i) + ".bmp", fmCreate);
try
{
MyFStream->CopyFrom(strm, strm->Size);
}
catch(...)
{
}
MyFStream->Free();
*/
//Memo1->Lines->Add("transfert initié.");
}
//---------------------------------------------------------------------------
void __fastcall TServeur::NMStrmServ1ClientContact(TObject *Sender)
{
NMStrmServ1->Port = 6711;
NMStrmServ1->Host = "127.0.0.1";
Memo1->Lines->Add("Le client s'est connecté.");
}
//---------------------------------------------------------------------------
void __fastcall TServeur::NMStrmServ1Disconnect(TObject *Sender)
{
Memo1->Lines->Add("Le client s'est déconnecté.");
}
//---------------------------------------------------------------------------
void __fastcall TServeur::NMStrmServ1Connect(TObject *Sender)
{
Memo1->Lines->Add("connecté");
}
//---------------------------------------------------------------------------
void __fastcall TServeur::NMStrmServ1ConnectionFailed(TObject *Sender)
{
ShowMessage ("Impossible de se connecter");
}
//---------------------------------------------------------------------------
void __fastcall TServeur::NMStrmServ1InvalidHost(bool &Handled)
{
Memo1->Lines->Add("adresse incorrecte");
}
//--------------------------------------------------------------------------- |
j'ai mis le code permettant d'enregistrer le fichier en commentaire.
et voici mon problème :
Lors d'un premier transfert tout se passe bien, mais dès qu'un autre suit apres, il y'a une erreur qui est déclenché, ESockError, socket operation on non socket, et ça quand le code permettant d'enregistrer le fichier est en commentaire.
quand il n'est pas en commentaire, tout va bien pour le premier transfert, le deuxième apparament aussi, sauf, qu'apres avoir attendu 50 ou 60 sec apres le 2ème transfert, une erreur ce déclenche, "violation d'accès mémoire", et ceux, au nom de transfert - 1, je ne sais pas si c'est car Serveur stream ne traite que le transfert d'un fichier ou pas
bref, j'aimerai votre avis, si ce n'est la solution
merci !!!!!