Recent

Author Topic: Synapse TFTP file transfer  (Read 11213 times)

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #60 on: May 30, 2020, 10:09:47 am »
But if my file is bigger than few GB?

rvk

  • Hero Member
  • *****
  • Posts: 6111
Re: Synapse TFTP file transfer
« Reply #61 on: May 30, 2020, 10:14:42 am »
But if my file is bigger than few GB?
Not a problem. Internally Synapse will take care of everything. Including a buffer for sending and receiving.

Only thing is you don't know the progress. But that's something for later.

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #62 on: May 30, 2020, 10:16:59 am »
but I can't send the whole file at once.

I have to send it in parts. not?
repeat
 read and send
until  done

repeat
 recv and write
until  done

rvk

  • Hero Member
  • *****
  • Posts: 6111
Re: Synapse TFTP file transfer
« Reply #63 on: May 30, 2020, 10:18:55 am »
but I can't send the whole file at once.
I have to send it in parts. not?
NO. SendStreamRaw does all that for you.
You only need the one call.
No need for a loop because that's done internally by Synapse.

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #64 on: May 30, 2020, 10:22:23 am »
woah...!!!

Coooool!!!

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #65 on: May 30, 2020, 10:23:25 am »
So with that I can send 9999 TB without 1TB RAM ?

rvk

  • Hero Member
  • *****
  • Posts: 6111
Re: Synapse TFTP file transfer
« Reply #66 on: May 30, 2020, 10:26:14 am »
So with that I can send 9999 TB without 1TB RAM ?
Yes. Because of the internal loop inside Synapse.

Do note... You done have a transfer-progress bar so you don't see how far rise 9999TB are. You could only see an indication when reading out MainStream.Position.

But a progressbar is something for later on I guess.

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #67 on: May 30, 2020, 10:27:49 am »
But I can do the progressbar with stream.position?

rvk

  • Hero Member
  • *****
  • Posts: 6111
Re: Synapse TFTP file transfer
« Reply #68 on: May 30, 2020, 10:32:03 am »
But I can do the progressbar with stream.position?
On the sender side, yes. Because you know the size there.
And if you work with threads. Not sure about ttimer.

On the receiving end you don't know the size (unless you transferred that via the string-socket).

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #69 on: May 30, 2020, 10:35:40 am »
I have problem...

rvk

  • Hero Member
  • *****
  • Posts: 6111
Re: Synapse TFTP file transfer
« Reply #70 on: May 30, 2020, 10:37:48 am »
I have problem...
How did you create the stream?
Seems like you didn't create the stream and then you get a sigsegv error when reading from a nil pointer.

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #71 on: May 30, 2020, 10:41:06 am »
Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  9.   strutils, FileUtil,
  10.   laz_synapse, blcksock;
  11.  
  12. type
  13.  
  14.   { TForm1 }
  15.  
  16.   TForm1 = class(TForm)
  17.     ChecksumEdit: TEdit;
  18.     FolderPath: TEdit;
  19.     FolderLocateButton: TButton;
  20.     FilePath: TEdit;
  21.     FileLocateButton: TButton;
  22.     FileSendButton: TButton;
  23.     ConnectButton: TButton;
  24.     Log: TMemo;
  25.     OpenFileDialog: TOpenDialog;
  26.     PortEdit: TEdit;
  27.     IpEdit: TEdit;
  28.     HostButton: TButton;
  29.     OpenFolderDialog: TSelectDirectoryDialog;
  30.     RadioButton1: TRadioButton;
  31.     RadioButton2: TRadioButton;
  32.     GetTimer: TTimer;
  33.     procedure ConnectButtonClick(Sender: TObject);
  34.     procedure ChecksumEditChange(Sender: TObject);
  35.     procedure FileLocateButtonClick(Sender: TObject);
  36.     procedure FileSendButtonClick(Sender: TObject);
  37.     procedure FolderLocateButtonClick(Sender: TObject);
  38.     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  39.     procedure FormCreate(Sender: TObject);
  40.     procedure HostButtonClick(Sender: TObject);
  41.     procedure RadioButton1Change(Sender: TObject);
  42.     procedure RadioButton2Change(Sender: TObject);
  43.     procedure GetTimerTimer(Sender: TObject);
  44.   private
  45.  
  46.   public
  47.  
  48.   end;
  49.  
  50. var
  51.   Form1: TForm1;
  52.  
  53. implementation
  54.  
  55. {$R *.lfm}
  56.  
  57. { TForm1 }
  58.  
  59. var MainServer:TTCPBlockSocket;
  60.     Connection:TTCPBlockSocket;
  61.     AcceptState:byte=1;
  62.     LogMessage:string;
  63.     connected:boolean;
  64.     filename:string;
  65.     mode:string;
  66.     checksum:string;
  67.     MainStream:TFileStream;
  68.     filesize:integer;
  69.     streambuffer:string;
  70.  
  71. procedure Logging;
  72. begin
  73.   Form1.Log.Lines.Add(LogMessage);
  74.   LogMessage:='';
  75. end;
  76.  
  77. procedure TForm1.FolderLocateButtonClick(Sender: TObject);
  78. begin
  79.   if OpenFolderDialog.execute then FolderPath.Text:=OpenFolderDialog.FileName;
  80.   SetCurrentDir(OpenFolderDialog.FileName);
  81. end;
  82.  
  83. procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  84. begin
  85.   Halt;
  86. end;
  87.  
  88. procedure TForm1.FormCreate(Sender: TObject);
  89. begin
  90.   mode:='string';
  91. end;
  92.  
  93. procedure TForm1.FileLocateButtonClick(Sender: TObject);
  94.  var f:file;
  95.      s:string;
  96. begin
  97.   if OpenFileDialog.execute then FilePath.Text:=OpenFileDialog.FileName;
  98.   filename:=ExtractDelimited(WordCount(OpenFileDialog.FileName,[DirectorySeparator]),
  99.   OpenFileDialog.FileName,[DirectorySeparator]);
  100.  
  101.   Filesize:=FileUtil.FileSize(OpenFileDialog.FileName);
  102.  
  103.   showmessage(filename+'  '+IntToStr(filesize));
  104. end;
  105.  
  106. procedure TForm1.FileSendButtonClick(Sender: TObject);
  107. begin
  108.   mode:='filesend';
  109.   FilePath.Enabled:=false;
  110.   if connected=true then
  111.   if Connection.CanWrite(10) then
  112.    if checksum<>'' then
  113.      Connection.SendString('>StartSendFile'+':'+filename+':'+IntToStr(filesize)
  114.       +':'+checksum+#13#10)
  115.    else
  116.      Connection.SendString('>StartSendFile'+':'+filename+':'+IntToStr(filesize)+#13#10);
  117.  
  118.   MainStream.Create(OpenFileDialog.FileName,fmOpenRead);
  119.   Connection.SendStreamRaw(MainStream);
  120.   MainStream.Free;
  121.   mode:='string';
  122. end;
  123.  
  124. procedure TForm1.ConnectButtonClick(Sender: TObject);
  125. begin
  126.   connection:=TTCPBlockSocket.Create;
  127.   Connection.CreateSocket;
  128.   Connection.Connect(IpEdit.Text,PortEdit.Text);
  129.   if Connection.LastError=0 then begin
  130.     LogMessage:=('Successfully connected to ('+Connection.GetRemoteSinIP+')');
  131.     connected:=true;
  132.   end;
  133.  
  134.   Logging;
  135. end;
  136.  
  137. procedure TForm1.ChecksumEditChange(Sender: TObject);
  138. begin
  139.   checksum:=ChecksumEdit.Text;
  140. end;
  141.  
  142. procedure TForm1.HostButtonClick(Sender: TObject);
  143. begin
  144.   MainServer:=TTCPBlockSocket.Create;
  145.   MainServer.CreateSocket;
  146.   MainServer.Bind(IpEdit.Text,PortEdit.Text);
  147.   MainServer.Listen;
  148.   LogMessage:='Server Run.';
  149.   Logging;
  150.  
  151.   repeat
  152.     case AcceptState of
  153.     0: begin
  154.          Exit;
  155.        end;
  156.  
  157.     1: begin
  158.          Application.ProcessMessages;
  159.          if MainServer.CanRead(100) then begin
  160.            Connection:=TTCPBlockSocket.Create;
  161.            Connection.CreateSocket;
  162.            Connection.Socket:=MainServer.Accept;
  163.            LogMessage:=('Connection accepted from ('+Connection.GetRemoteSinIP+')');
  164.            if LogMessage<>'' then Logging;
  165.            connected:=true;
  166.          end;
  167.        end;
  168.  
  169.     end;
  170.  
  171.   until false;
  172. end;
  173.  
  174. procedure TForm1.RadioButton1Change(Sender: TObject);
  175. begin
  176.   if RadioButton1.Checked=true then AcceptState:=1;
  177. end;
  178.  
  179. procedure TForm1.RadioButton2Change(Sender: TObject);
  180. begin
  181.   if RadioButton1.Checked=true then AcceptState:=0;
  182. end;
  183.  
  184. procedure TForm1.GetTimerTimer(Sender: TObject);
  185.  var messagein:String;
  186.      infile_name:string;
  187.      infile_size:string;
  188.      infile_checksum:string;
  189.      f:file;
  190.      n:integer;
  191. begin
  192.   //TEXT MODE
  193.  if connected then begin
  194.  
  195.     if mode='string' then begin
  196.        messagein:=Connection.RecvString(10);
  197.     if (messagein<>'') and (messagein[1]<>'>') then begin
  198.      LogMessage:=messagein;
  199.       Logging;
  200.     end
  201.     else
  202.       if (messagein<>'') and (messagein[1]='>') then begin
  203.           mode:='fileaccept';
  204.  
  205.           infile_name:=ExtractDelimited(2,messagein,[':']);
  206.           infile_size:=ExtractDelimited(3,messagein,[':']);
  207.           infile_checksum:=ExtractDelimited(4,messagein,[':']);
  208.  
  209.           LogMessage:='Accepting file: '+infile_name+' Size: '+
  210.            infile_size+' Checksum: '+infile_checksum;
  211.           logging;
  212.         end;
  213.   end;
  214.   //FILE MODE
  215.   if mode='fileaccept' then begin
  216.    FolderPath.Enabled:=false;
  217.  
  218.    MainStream.Create(infile_name,fmCreate);
  219.    Connection.RecvStreamRaw(MainStream, 10);
  220.    MainStream.Free;
  221.    mode:='string';
  222.  
  223.   end;
  224.  
  225.  
  226.  end;
  227. end;
  228.  
  229.  
  230. end.
  231.                            
  232.  

rvk

  • Hero Member
  • *****
  • Posts: 6111
Re: Synapse TFTP file transfer
« Reply #72 on: May 30, 2020, 10:45:09 am »
This line is incorrect.
MainStream.Create(OpenFileDialog.FileName,fmOpenRead)
Also for the reading stream.
You don't assign anything to MainStream but called Create directly on the nil-pointer.

It schould be something like
MainStream := TFileStream.Create(...
(Both for reading and writing stream)

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #73 on: May 30, 2020, 10:47:58 am »
ohh... really...

Jake012345

  • Sr. Member
  • ****
  • Posts: 270
  • Knowledge is the key
Re: Synapse TFTP file transfer
« Reply #74 on: May 30, 2020, 10:52:34 am »
and the Unable to open file error?

 

TinyPortal © 2005-2018