Transfert d'informations ip to ip , c chaud ?

Transfert d'informations ip to ip , c chaud ? - Delphi/Pascal - Programmation

Marsh Posté le 21-05-2003 à 13:25:15    

Bon je m'explique ...  
J'aimerais bien faire  une conec ip - > ip entre un logiciel delphi  
 
imaginons  
 
toto a le prog et se met en mode receive , tata peut alors envoyer un fichier ou du texte ( pour chat par ex ) a toto en entrant son ip ?  
 
c dur a faire ?  
vous avez de tutos sous la mains ?  
 
Merci d'avance !


Message édité par piloud le 21-05-2003 à 20:20:44
Reply

Marsh Posté le 21-05-2003 à 13:25:15   

Reply

Marsh Posté le 21-05-2003 à 13:27:28    

Soit tu le fais à la main avec TClientSocket/TServerSocket ou les composants TCP de Indy, ou alors pour le transfert de fichiers tu utilises par ex les composants FTP de Indy


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 21-05-2003 à 14:07:42    

:(  delphi me dit que dans ma verison , ya pas d'aide pour les Tserversocket et TclientSocket :(  
 
et je crois qui va me falloir un tuto :)
 
 
transfert de fichier impossible via TclientSocket/TserverSocket ?
 
Sachant que le but n'est pas de faire un transfert de fichier avec une interface graphique a la smartftp et etc...
mais c juste le programme qui se charge de faire choisir le fichier a uploader .... et le serveur doit le placer dans le directory de son choix ....  
 
Puis c koi exactement le socket ?  
et puis moi pour linstant .. ( euh jai jamais utiliser ca encore lol )  
j'arrive pas plus loin que ca ....  
 

Code :
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. Serveur.Port:=5555;
  4. Serveur.Active:=true;
  5. Serveur.
  6. end;
  7. procedure TForm1.Button2Click(Sender: TObject);
  8. begin
  9. Client.Port:=5555;
  10. Client.Active:=true;
  11. end;


 
Comment specifié lip dans la partie client , et fait en sorte dans la partie serveur .. quil se mette sur l'ip internet et sur l'ip local  
 
 
puis comment envoyer un message recuparable par une variable de type string coté serveur
 
 voila c tout  :lol:  
merci d'avance  
 

Reply

Marsh Posté le 21-05-2003 à 14:28:36    

pour texte , jai trouve : http://delphipage.free.fr/sockets.html
 
pour les files ca a lar plus cho : )  
help !  
sil le faut ou je peux trouver les indy et commentl es utiliser ?

Reply

Marsh Posté le 21-05-2003 à 14:30:32    

indy c'est inclus depuis delphi 6, mais peut-être pas dans les versions "personal"  
http://www.nevrona.com/Indy/
 
pour le ftp, je vois pas ce que le graphique vient faire dans l'histoire, ftp c'est juste un protocole pour le transfert de fichiers


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 21-05-2003 à 14:35:28    

bha au debut je pensais que le compo indy cetait un genre de client ftp graphique c pour ca ...  
mais bon c pas grave :)

Reply

Marsh Posté le 21-05-2003 à 16:36:05    

dans le site du que jai trouve , il ne parle pas de propriete .active  Or elle est initialisee par defaut a false , normal ?  

Reply

Marsh Posté le 21-05-2003 à 16:41:59    

Oh ******  ....  
Le serveur ne peut pas envoyer de texte au client via /Tsocketserver/Tsocketclient ???
 

Reply

Marsh Posté le 21-05-2003 à 17:12:21    

up pourla derniere question

Reply

Marsh Posté le 21-05-2003 à 17:43:52    

c bon jai trouve

Reply

Marsh Posté le 21-05-2003 à 17:43:52   

Reply

Marsh Posté le 21-05-2003 à 20:14:25    

quand jenvoi un message text via les socket , j'ai cette erreur :  
 
erreur socket windows : une requete d'envoi ou de reception de donnees n'a pas ete autorizee car le socket n'est pas connecte(lors de l'envoi sur un socket datagramme en utilisant un apel sendto) aucune adresse na ete fournie !  
 
alors voila .. j'ai ce message d'erreur que quand c le serveur qui envoi le message  
 
quand c le client qui envoit ca passe ...  
mais quand c le serveur qui envoit , ca ne passe pas et j'ai ce bug ...  
 
exemple d'envoi du serveur :  
ServerSocket1.Socket.SendText(pseudo.Text+envoi_message.Text);
exemple d'envoi du client :  
ClientSocket1.Socket.SendText('<'+pseudo.Text+'> '+envoi_message.Text);
 
 
ptet qu'oon peu pas utiliser socket.sendtext du server vers le client mais bon pourkoi  le server il a la fonction send text alors ?  
et pourkoi le client il aurait la fonction receivetext, ca tient pas debout DONC  
HEEEELLLPPP !          
 
ps : Vous etes content ?:)jai delete l'autre topic ! un peu d'aide maintenant please :)


Message édité par piloud le 21-05-2003 à 20:16:14
Reply

Marsh Posté le 21-05-2003 à 20:23:14    

bon j'ai sorti le topic de la corbeille et y ai mis l'autre, vu que tu t'étais trompé :D
 
Pour ton problème d'envoi, c'est quand le serveur doit envoyer au client ?
Il me semble qu'il faut savoir quelle connexion utiliser (vu que le serveur peut être connecté à plusieurs clients), il doit y avoir un truc qui te permet d'avoir la liste des connexions ouvertes (un tableau de sockets, le_socket_serveur.Socket.Connections[...] ou un truc du genre...
Je sais plus de tête comment ça marche, mais il doit bien y avoir des tutoriels sur le net


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 21-05-2003 à 21:27:23    

:lol: je savias pas qu'on pouvait faire ca ... :)
 
oui c quand le serveur doit envoyer au client(s) ...
ton hypothese est tres probable vu que je ne defini aucun clients a qui envoyer ... Je v me renseinger  
 
l'ideal ca serai qu'il envoi a tous ! :)  
 
merci !
 
 

Reply

Marsh Posté le 21-05-2003 à 21:34:25    

piloud a écrit :

pour texte , jai trouve : http://delphipage.free.fr/sockets.html
 
pour les files ca a lar plus cho : )  
help !  
sil le faut ou je peux trouver les indy et commentl es utiliser ?  

Tu envoies une suite d'octets, c'est tout.
C'est à toi de faire en sorte que chaque appli sache à quoi correspondent les données qui circulent [:proy]  
Un protocole en quelque sorte :)


Message édité par mrbebert le 21-05-2003 à 21:34:43
Reply

Marsh Posté le 22-05-2003 à 18:54:32    

antp a écrit :

bon j'ai sorti le topic de la corbeille et y ai mis l'autre, vu que tu t'étais trompé :D
 
Pour ton problème d'envoi, c'est quand le serveur doit envoyer au client ?
Il me semble qu'il faut savoir quelle connexion utiliser (vu que le serveur peut être connecté à plusieurs clients), il doit y avoir un truc qui te permet d'avoir la liste des connexions ouvertes (un tableau de sockets, le_socket_serveur.Socket.Connections[...] ou un truc du genre...
Je sais plus de tête comment ça marche, mais il doit bien y avoir des tutoriels sur le net


 
 
J'ai trouve , je post pour si jamais j'oublier et pour te rafraichir la memoire antp :)  
 
For I:=0 To ServerSocket1.Socket.ActiveConnections -1
Do ServerSocket1.Socket.Connections[I].SendText(a);
 
vala .. je v essayer de commprendre le send file maintenant :)  

Reply

Marsh Posté le 24-05-2003 à 13:42:41    

Bon pour le send fichier jai ca comme erreur au moment de l'envoi :  
 
 
E/S 998 : L'accès à cet emplacement de la mémoire n'est pas valide.
 
l'erreur se produit sur le client ... et non pas sur le serv  
le serveur etant celui qui envoi le fichier
 
 
ca pas tres explicite pour moi ... donc help :) !


Message édité par piloud le 24-05-2003 à 13:43:46
Reply

Marsh Posté le 24-05-2003 à 13:57:43    

ca se passe quand au moment du
 
 
p:=socket.ReceiveBuf(tab,socket.ReceiveLength);
blockwrite(freception,tab,p);  --> a ce moment la jai lexeption e/s998
 
 
tab etant mon buffer

Reply

Marsh Posté le 24-05-2003 à 21:20:34    

:bounce:  :bounce: help

Reply

Marsh Posté le 24-05-2003 à 21:27:23    

Certainement un problème de taille de buffer. Soit l'un des buffers n'est pas assez grand, soit tu essaies de traiter plus d'informations qu'il n'y en a réellement [:proy]

Reply

Marsh Posté le 25-05-2003 à 13:59:25    

j arrive pas .... voici ma lecture .... + envoi
 
 
blockread(fenvoi,tab,sizeof(tab),r);
 ServerSocket1.Socket.Connections[0].SendBuf(tab,r);
 i:=i+r;
 log.Lines.Add('Upload ..' + inttostr(i) +' bytes');
 if i>=Taillefenvoi then
  begin
  closefile(fenvoi);
  ServerSocket1.Socket.Connections[0].SendText('!?!CFINI!?!');
  TimerServeur.Enabled:=false;
  end;
 
et ma reception + ecriture
 
 
begin
 //reception fichier
  p:=socket.ReceiveBuf(tab,socket.ReceiveLength);
  blockwrite(freception,tab,p,w);
  if a = '!?!CFINI!?!' then
   begin
   closefile(freception);
   ITSFICHIER:=false;
   end;
  exit;
 end;
 
help !
 

Reply

Marsh Posté le 25-05-2003 à 18:12:41    

mrBebert a écrit :

Certainement un problème de taille de buffer. Soit l'un des buffers n'est pas assez grand, soit tu essaies de traiter plus d'informations qu'il n'y en a réellement [:proy]  


 
 
oui mais enfin bon , c pas moi qui specifie la taille des buffers ou si ? :)  
 
dans l'aide delphi jai trouve ca :  

Citation :


Si AmtTransferred est omis, une erreur d'E/S se produit si le nombre d'enregistrements écrits n'est pas égal à Count. Si la directive du compilateur $I+ est effective, les erreurs déclenchent une exception EInOutError.


 
mais c un peu du chinois pour moi ....  
so help !  

Reply

Marsh Posté le 25-05-2003 à 18:14:13    

Pour les fichiers c'est plus facile d'utiliser les TFileStream que les fichiers comme ceux que tu utilises


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-05-2003 à 20:33:16    

mouah je veux bien  
mais ca oblige a faire une autre conection CLIENT SERV pendant le transfert du fichier non ?  
 
je peux pas utiliser mes socket actuelles ...  
et on je peux trouver ce TfileStream ?  

Reply

Marsh Posté le 25-05-2003 à 20:36:55    

:??: je vois pas le rapport, TFileStream c'est pour sauver ton fichier en local, à la place des fonctions Pascal AssignFile/CloseFile et de ce blockwrite que j'avais jamais vu :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 11:34:23    

ha ok je croyais que cetait un composant delphi moi ... :)
ok je v me renseigner !

Reply

Marsh Posté le 26-05-2003 à 12:33:40    

sachant que les fichier sont a transferer sont du type ini  
 
je doit utiliser koi comme readbuffer ? (pour les Tfilestream)
 
LeFichier.ReadBuffer(MaVariableDeTypeString, SizeOf(MaVariableDeTypeString)); ?
 
Lefichier.WriteBuffer(VariableDeTypeString, SizeOf(MaVariableDeTypeString));
 
Je v avoir le meme fichier au debut et a la fin ?  
 
 
Biensur , je pourrai aussi recup .. toutes les valeurs du ini et les envoyer par des socket.sendtext et les reecrir a l'arrivee mais si je pouvait eviter ... moi je voudrai une copie conforme du fichier ..  
 
le mieux ca se serait une copie byte par byte en faite ...  
so HELP :)
 

Reply

Marsh Posté le 26-05-2003 à 13:56:53    

tu risques de tout bousiller à jouer avec des chaînes comme ça :D
 
SetLength(Chaine, Fichier.Size);
Fichier.Read(@Chaine[1], Fichier.Size);
 
-> le contenu est dans Chaine
 
Et pour écrire:
 
Fichier.Write(@Chaine[1], Fichier.Size);
 
il faut peut-être pas le @ devant, à tester (il le dira à la compilation si ça ne lui plaît pas)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 16:32:18    

antp a écrit :

tu risques de tout bousiller à jouer avec des chaînes comme ça :D
 
SetLength(Chaine, Fichier.Size);
Fichier.Read(@Chaine[1], Fichier.Size);

 
-> le contenu est dans Chaine
 
Et pour écrire:
 
Fichier.Write(@Chaine[1], Fichier.Size);
 
il faut peut-être pas le @ devant, à tester (il le dira à la compilation si ça ne lui plaît pas)


 
tu veux bien me le commenter , histoire que je ne meurt pas idiot ... parceque je pige pas exactement ce que ca fait les @ et le SetLength

Reply

Marsh Posté le 26-05-2003 à 16:36:47    

SetLength c'est pour réserver une taille de chaine  
Read & ReadBuffer ne savent pas que tu vas écrire vers une variable de type chaîne, donc elles ne vont pas réserver la mémoire avant d'aller écrire dedans (quand tu fais chaine1 := 'truc' delphi réserve de la mémoire pour chaine1 pour pouvoir y placer 'truc', c'est automatique parce que là delphi sait que chaine1 est une chaine).
Le [1] c'est parce que le début de la chaîne est à la position 1 (premier caractère) donc c'est là qu'il faudra commencer à écrire/lire.
Le @ c'est parce que Read & Write s'attendent peut-être à avoir un pointeur (adresse mémoire) plutôt qu'une bête variable. Mais je n'en suis plus sûr. S'il faut pas le @, le compilateur râlera.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 16:52:56    

euh petite question , dans ton exemple ... chaine , elle peut aller jusque quelle taille ?  
ca plante a combien ? :)

Reply

Marsh Posté le 26-05-2003 à 16:55:11    

255 octets sous Delphi 1
2 Go sous Delphi 2 à 7


Message édité par antp le 26-05-2003 à 16:55:46

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 16:59:08    

lol ca devrait passer ! :)

Reply

Marsh Posté le 26-05-2003 à 17:07:00    

pour l'ecriture je doit pas faire le setlength ? ou si ?  
 
sachant qu'il n'aura pas ete fait avant car la lecture se fait sur mon soft serveur et la reception sur mon soft client

Reply

Marsh Posté le 26-05-2003 à 17:10:45    

t'es un peu vague avec lecture/écriture... tu parle d'écriture dans la chaîne ou dans le fichier ?
 
avant d'écrire vers une chaîne avec un truc qui s'attend à avoir autre chose qu'une chaîne (comme ici la méthode Read du TStringList), tu dois toujours faire un SetLength (sauf si à chaque fois le truc que tu lis à pile la même taille et que tu n'as pas modifié ta chaîne évidemment)


Message édité par antp le 26-05-2003 à 17:11:49

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 17:28:34    

apparament ca compile ok ( en enlevant les @)  mais jai un probleme ...  
 
Tfilestream ne me laisse pas ouvrir un fichier qui n'existe pas ... comment je fait ?

Reply

Marsh Posté le 26-05-2003 à 17:51:12    

Dans l'aide de TFileStream.Create y a les différents modes d'ouverture :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 19:26:26    

help !  
 
//reception fichier
  freception:=Tfilestream.Create(extractfilepath (application.ExeName)+NomFichierReception,fmCreate or fmShareDenyNone);
   
  socket.ReceiveBuf(ChaineReception,socket.ReceiveLength);
  freception.Write(ChaineReception[1],sizeof(ChaineReception));
   
 
 
 
 
//envoi
 routefichier:=Filename;
     Fenvoi:=Tfilestream.Create(routefichier,fmCreate or fmShareDenyNone);
 
 SetLength(Chaine, Fenvoi.Size);
 Fenvoi.Read(Chaine[1], Fenvoi.Size);
 ServerSocket1.Socket.Connections[0].SendBuf(Chaine,r);
 
la ya double probleme ... premierement , le fichier envoyé est vide :) (au moins il se cré , c'est deja ca )  
 
puis il vide le fichier local ....( celui que j'envoi ...)
 
help antp


Message édité par piloud le 26-05-2003 à 19:37:12
Reply

Marsh Posté le 26-05-2003 à 19:37:50    

ou c'est que c faut ?  :(  :(

Reply

Marsh Posté le 26-05-2003 à 19:47:59    

heu pour ReceiveBuf & SendBuf tu dois aussi prendre le [1] et redimensionner la chaîne avant d'écrire dedans :o
cf ce que j'ai écrit cet aprem :  

Citation :


avant d'écrire vers une chaîne avec un truc qui s'attend à avoir autre chose qu'une chaîne (comme ici la méthode Read du TStringList), tu dois toujours faire un SetLength


(et ReceiveBug / SendBuf prennent un paramètre non type justement, donc c'est le même cas que pour le Read/Write tu TFileStream)
 
Si le fichier local lu est vidé, c'est que tu l'ouvres en fmOpenWrite au lieu de fmOpenRead, non ?


Message édité par antp le 26-05-2003 à 19:48:38

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-05-2003 à 20:05:02    

je l'ouvre en fmCreate mais d'apres laide , c aussi en mode ecriture :)  
 
ok mci , je v voir ce que je peux faire maintenant !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed