Utilisateur anonyme
-
30 oct. 2005 à 15:50
Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 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
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;
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;
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;
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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...
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.
Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 octobre 20071 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.