Erreur de type asynchrone [Résolu]

Utilisateur anonyme - 30 oct. 2005 à 15:50 - Dernière réponse : Filipe35
Messages postés
496
Date d'inscription
vendredi 14 novembre 2003
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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
WhiteHippo
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
- 1 nov. 2005 à 12:03
3
Merci
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...

Merci WhiteHippo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de WhiteHippo
Utilisateur anonyme - 30 oct. 2005 à 17:50
0
Merci
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 ??
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 30 oct. 2005 à 18:34
0
Merci
Bah non ca change rien en fait .Aideeezzz moi svp

Merci
Commenter la réponse de Utilisateur anonyme
Filipe35
Messages postés
496
Date d'inscription
vendredi 14 novembre 2003
Dernière intervention
23 octobre 2007
- 1 nov. 2005 à 12:23
0
Merci
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.
Commenter la réponse de Filipe35

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.