Transfert d'informations ip to ip , c chaud ? - Delphi/Pascal - Programmation
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
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 :
|
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
merci d'avance
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 ?
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
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
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 ?
Marsh Posté le 21-05-2003 à 16:41:59
Oh ****** ....
Le serveur ne peut pas envoyer de texte au client via /Tsocketserver/Tsocketclient ???
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
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é
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
Marsh Posté le 21-05-2003 à 21:27:23
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 !
Marsh Posté le 21-05-2003 à 21:34:25
piloud a écrit : pour texte , jai trouve : http://delphipage.free.fr/sockets.html |
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
Un protocole en quelque sorte
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é |
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
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 !
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
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
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 !
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 |
oui mais enfin bon , c pas moi qui specifie la taille des buffers ou si ?
dans l'aide delphi jai trouve ca :
Citation : |
mais c un peu du chinois pour moi ....
so help !
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
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 ?
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
Marsh Posté le 26-05-2003 à 11:34:23
ha ok je croyais que cetait un composant delphi moi ...
ok je v me renseigner !
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
Marsh Posté le 26-05-2003 à 13:56:53
tu risques de tout bousiller à jouer avec des chaînes comme ça
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)
Marsh Posté le 26-05-2003 à 16:32:18
antp a écrit : tu risques de tout bousiller à jouer avec des chaînes comme ça |
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
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.
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 ?
Marsh Posté le 26-05-2003 à 16:55:11
255 octets sous Delphi 1
2 Go sous Delphi 2 à 7
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
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)
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 ?
Marsh Posté le 26-05-2003 à 17:51:12
Dans l'aide de TFileStream.Create y a les différents modes d'ouverture
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
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
cf ce que j'ai écrit cet aprem :
Citation : |
(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 ?
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 !
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