Bonjours,
J'aimerais savoir comment envoyer un fichier utilisant l'API Socket
J'ai essayé divers moyens mais aucun malheureusement n'a fonctionné .
existe t il un exemple ?
Merci!
Bonjours,
J'aimerais savoir comment envoyer un fichier utilisant l'API Socket
J'ai essayé divers moyens mais aucun malheureusement n'a fonctionné .
existe t il un exemple ?
Merci!
Lorsque tu parles d'API Socket, tu veux dire WinSock directement, comme le fait Paul Toth ?
Tu peux fournir un bout de code, parce qu'envoyer un fichier, c'est juste envoyé, un message structuré, contenant, le nom du fichier et ensuite son contenu ... en gros, tu reponds un FTP à ta sauce ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Quand je dit Socket API , sa veut dire sans utiliser les composants VCL comme TServerSocket ou TClientSocket , c'est utiliser les sockets a l'etat pur .
Je voudrai simplement envoyer et recevoir un Fichier entre Client/Server.
voila un bout de code !
[Doit recevoir]
[Envoi]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 procedure SocketWorkThread(wSock :TSocket);stdcall; var recvbuf :array[0..8192] of Char; Receive,i :Integer; cString :String; hSock : integer; //Socket Handle {Sin Info} sID,sIP,sLan,sUCname,sPing,sIdle:String; iPing,iNPing:Integer; F :THandle; filename:string; BytesRead :Cardinal; BytesSize :Cardinal; FileSize :Integer; rFile :Array[0..8192] Of Char; dErr :Integer; Total :Integer; begin try while true do begin hSock := wSock; Receive := recv(wSock,recvbuf,buflen,0); if Receive < 1 then begin {Socket disconnected----------------------------------------------------} CloseSocket(wSock); ExitThread(0); {-----------------------------------------------------------------------} end; ReceiveTotal := ReceiveTotal + Length(PChar(@recvbuf)); FrmMain.status.Panels[2].text := 'up : '+IntToStr(ReceiveTotal); cString := PChar(@recvbuf); {Socket OnRead------------------------------------------------------------} Total := 1; FileName := 'c:\try.exe'; F := CreateFile(pChar(FileName), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, 0, 0); BytesSize := 0; FileSize := 153088; SetFilePointer(F, 0, NIL, FILE_BEGIN); If BytesSize < FileSize Then Begin Repeat FillChar(rFile, SizeOf(rFile), 0); ReadFile(F, rFile, SizeOf(rFile), BytesRead, NIL); dErr := Send(wSock, rFile, BytesRead, 0); If dErr = -1 Then Break; Inc(Total, dErr); Recv(wSock, rFile, SizeOf(rFile), 0); Until (Total >= FileSize); {-------------------------------------------------------------------------} end; end; except {Log there} Exit; end; end;
Sa ne marche pas , sa se bloque !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Procedure SendFile(Name:String); var Buf :Array[0..8192] Of Char; T:String; F :File; BytesRead :Cardinal; Begin {$I-} AssignFile(F, Name); Reset(F, 1); Repeat BlockRead(F, Buf, SizeOf(Buf), BytesRead); If (BytesRead = 0) Then Break; Send(S, Buf[0], SizeOf(Buf), 0); FillChar(Buf, SizeOf(Buf), 0); Recv(S, Buf, SizeOf(Buf), 0); Until BytesRead = 0; CloseFile(F); {$I+} End;
ReadFile dans la fonction de reception ?
C'est pas plutôt un WriteFile ?
Et tu refaits un Send après ???
même ta fonction d'envoi, tu veux recevoir ce que tu envois avec ce Recv qui écrit en plus dans le même buffer que celui du fichier, c'est très confu !
tu devrais avant de t'attaquer au fichier, tu faire une petite classe qui encaspule le socket ou tu enverras des chaines de test, puisque ensuite tu utilisera cette classe pour envoyer un fichier bout par bout ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Le système d'envoi et réception de texte fonctionne parfaitement je suis simplement bloquer pour l'envoi de fichier .
J'ai essayer de me baser sur l'unit ScktComp pour SendStream et sa bloque toujours au bout des premiers octet envoyer .
Existe t il un exemple d'envoi de fichier utilisant Winsock ?
Merci,
Peux-tu donner ton code d'envoi et Reception pour une chaine, il vaut mieux repartir de ce code fonctionnel que de vouloir modifer le code que tu as fourni, qui n'est pas très cohérent ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
J'ai remanier tout le code , et la sa marche pour le transfer mais ! bizarement le fichier est un peu plus gros que l'original , j'ai ouvert avec bloc note , et certaine parties du fichier sont répété plusieurs fois ... mais le fichier s'ouvre correctement dans la plus par des cas :/
Voila le nouveau code d'envoi :
et dans l'evenement de reception il y a juste un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 procedure SendFile(FileName:String); var size,i,ByteRead : Integer; Buf : Array[0..8192] Of Char; F : File; Name : String; Begin AssignFile(F,FileName); Reset(F,1); size := GetFSize(FileName); i := 0; while i <= size do begin i := i+ 8192; BlockRead(F, Buf, sizeof(Buf) , ByteRead); Send(s,buf,sizeof(buf),0); End; CloseFile(F); {------------------------------------} End;
Merci,
Code : Sélectionner tout - Visualiser dans une fenêtre à part BlockWrite(F, recvbuf, sizeof(recvbuf));
J'ai partiellement résolut le problème , merci de ton aide ShaiLeTroll !
Oui ! depuis longtemps :pEt t'as cliqué sur « Résolu » ? ? ?
Merci je vais tester si sa marche mieu !De 0 à 8192 chez moi ça fait 8193...
Essaye en comptant sur tes doigts de 0 à 4 : tu vas compter avec 5 doigts,
Jette donc un oeil à l'exemple de l'aide sur BlockRead, BlockWrite ou SaveDialog.
Partager