Erreur de type asynchrone

Résolu
Utilisateur anonyme - 30 oct. 2005 à 15:50
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 - 1 nov. 2005 à 12:23
Salut à tous,

j'ai voulu faire un petit test de transfert de fichiers transfert client->serveur :

La connection du client au serveur s'effectue correctement.
La sélection du fichier aussi
Cependant tout de suite apres deux messages d'erreur apparaisent :

problème de type asynchrone et "windows socket error : (11001) on API 'ASync Lookup. Je ne comprends pas pourquoi

************
voila les sources

client : unit client;


unit client;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, shellapi;


type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Edit2: TEdit;
ClientSocket1: TClientSocket;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;



implementation


{$R *.dfm}


Const
TailleBloc = 256;
Type
TIPTrame=Packed Record
Case ttType:Integer Of
1:( ttNomFichier:String[255];);
2:( ttDebut : Integer; ttLong : Integer; ttDatas : Array[0..TailleBloc-1] Of Byte )
End;


var


ClientFichier : File; // Fichier en cours d'envoi
ClientTrame : TIPTrame; // Copie de la dernière trame envoyée


Procedure EnvoiBlocEnCours;


Begin
With ClientTrame Do
Begin
// Procédure d'envoi d'un morceau de fichier
// est appelée par ClientRead


// C'est une trame de type morceau de fichier
ttType:=2;


// Lecture dans le fichier
Seek(ClientFichier,ttDebut);
BlockRead(ClientFichier,ttDatas,TailleBloc,ttLong);


// Envoi du morceau
// La longueur envoyée est
// 4 ( taille de ttType ) + 4 ( taille de ttDebut ) + 4 ( taille de ttLong )
// + ttLong ( nombre de données envoyé )
Form1.ClientSocket1.Socket.SendBuf(ClientTrame,ttLong+12);


End;
End;


procedure Envoisclient;
Var CodeRetour:Integer;
begin
With ClientTrame Do
Begin
// On reçoit le code d'erreur du serveur, on le traite suivant les cas
Form1.ClientSocket1.Socket.ReceiveBuf(CodeRetour,4);


Case ttType Of
1:Begin
If CodeRetour=0
Then Begin
ttDebut:=0;
EnvoiBlocEnCours;

End;
End;


2:Begin
If CodeRetour=0
Then Begin
Inc(ttDebut,ttLong);
If ttDebut<FileSize(ClientFichier)
then EnvoiBlocEnCours ;
End;
end;
Else Begin
EnvoiBlocEnCours;
End;
End;
End;
End;



procedure TForm1.Button1Click(Sender: TObject); //connection au serveur
begin
Form1.ClientSocket1.Host := Edit2.Text;
Form1.ClientSocket1.Open;
edit2.text:='connecté'
end;


procedure TForm1.Button2Click(Sender: TObject); //fermeture de la connection
begin
ClientSocket1.Close;


end;


procedure TForm1.Button4Click(Sender: TObject); //arret de la procedure d'envoi
begin
CloseFile(ClientFichier);
end;


procedure TForm1.Button3Click(Sender: TObject); // Bouton Envoyer
begin
If Not OpenDialog1.Execute Then Exit;
AssignFile(ClientFichier,OpenDialog1.FileName);
Reset(ClientFichier,1);
ClientTrame.ttType:=1;
ClientTrame.ttNomFichier:=ExtractFileName(OpenDialog1.FileName);
Form1.ClientSocket1.socket.sendtext('transfertclientserver|');
Edit1.text:='transfertclientserver';
Form1.ClientSocket1.Socket.SendBuf(ClientTrame,4+Length (ClientTrame.ttNomFichier)+1);
Envoisclient;
end;


end.


--------------------------------------------
--------------------------------------------

serveur :

unit serveur;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;


type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ServerSocket1: TServerSocket;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation


{$R *.dfm}


Const
TailleBloc = 256;
Type
TIPTrame=Packed Record
Case ttType:Integer Of
1:( ttNomFichier:String[255];);
2:( ttDebut : Integer; ttLong : Integer; ttDatas : Array[0..TailleBloc-1] Of Byte )
End;


Procedure Receptionserveur ;


Var Buffer:TIPTrame;
Erreur:Integer;
Recus :Integer;
ServeurEnReception : Boolean ;
ServeurAdresseClient : String ;
ServeurFichier : File;


Begin
ServeurEnReception:= False;
ServeurAdresseClient:= '';
Erreur:=0;
Recus :=Form1.ServerSocket1.socket.ReceiveLength;
If Recus<= SizeOf(Buffer)
Then With Buffer Do Begin
Form1.ServerSocket1.socket.ReceiveBuf(Buffer,Recus);
Case ttType Of
1:Begin
If (Recus>=5)And(Recus>=(5+Length(ttNomFichier)))
Then Begin
If ServeurEnReception Then CloseFile(ServeurFichier);
AssignFile(ServeurFichier,ExtractFilePath(ParamStr(0))+ttNomFichier);
Try
Rewrite(ServeurFichier,1);
ServeurEnReception:=True;
Erreur:=0;
Except
Erreur:=5;
End;
End
Else Erreur:=2;
End;


2:Begin
If (Recus>=12)And(Recus>=(12+ttLong))
Then Begin
If ServeurEnReception
Then Begin
If (ttDebut>=0)And(ttDebut<=FileSize(ServeurFichier))
Then Begin
Try
Seek(ServeurFichier,ttDebut);
BlockWrite(ServeurFichier,ttDatas,ttLong);
Erreur:=0;
Except
Erreur:=6;
End;
End
Else Erreur:=4;
End
Else Erreur:=3;
End
Else Erreur:=2;
End;


End;
End
Else Erreur:=1;
Form1.ServerSocket1.socket.SendBuf(Erreur,4);
END;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);


var
line : string;


begin
line := Form1.ServerSocket1.socket.receivetext ;
if Copy(line, 1, Pos('|', line)-1 ) = 'transfertclientserver' then
begin
edit1.text:='transfertclientserver';
Receptionserveur;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;


end.

Merci de m'aider

4 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
1 nov. 2005 à 12:03
L'erreur 11001 correspond à "Host Not Find." en clair l'hote n'est pas trouvé et donc ta connection ne s'effectue pas correctement...

Pour trester et voir résoudre simplement ton cas tu met le port à 4999 (Moi j'aime bien celui là :) du côté serveur et du côté client.
Ensuite du côté client dans le Edit2 tu écris 127.0.0.1 qui correspond à l'adresse IP de ton PC (Comme ça tu travailles en local sur toon poste ce qui te permettra en plus par la suite de plus facilement débugger ton client et ton serveur.)
Enfin tu lances le serveur et enfin le client.

Là tu ne devrais plus avoir de message d'erreur liée à la connexion.

Cordialement.


<HR>
Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
3
Utilisateur anonyme
30 oct. 2005 à 17:50
Au niveau du messaeg asynchrone il semblerait que cela vienne du fait que les evenements onlisten et onaccept du socket serveur n'est pas été utilisés.

Un simle edit1.text:='blabla'; change tout

Pourquoi ??
0
Utilisateur anonyme
30 oct. 2005 à 18:34
Bah non ca change rien en fait .Aideeezzz moi svp

Merci
0
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
1 nov. 2005 à 12:23
Salut,



j'ai fais une source sur les sockets, jettes y un oeil ;)




_________________________________________________
http://www.OgameTut.Free.Fr - Le site sur ogame de référence !
http://Signz.free.fr - Le générateur de signatures par excellence !
Bonne Prog à tous.
0
Rejoignez-nous