Page 1 of 1

How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Wed Jan 02, 2013 11:04 am
by sec
Have you example for using ReceiveNetworkData/SendNetworkData to send/receive one file?

Thanks much.

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Wed Jan 02, 2013 7:29 pm
by STARGĂ…TE
read the file into memory, and send: size of memory and the data to the client.
On the other side receive the length und receive the data ...

if you send more files or different things, you have to write your own header, so the client knows what's coming.

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Wed Jan 02, 2013 11:17 pm
by infratec
Small example:

Client:

Code: Select all

Procedure.i NetworkSendFile(Connection.i, Filename$)
  
  Protected Result.i, File.i, Size.q, *Buffer, Offset.i
  
  
  File = ReadFile(#PB_Any, Filename$)
  If File
    Size = Lof(File)
    Filename$ = "FILE:" + GetFilePart(Filename$) + ":" + Str(Size)
    *Buffer =  AllocateMemory(Size + Len(Filename$) + 1)
    If *Buffer
      PokeS(*Buffer, Filename$)
      If ReadData(File, *Buffer + Len(Filename$) + 1, Size) = Size
        If SendNetworkData(Connection, *Buffer, MemorySize(*Buffer)) = MemorySize(*Buffer)
          Result = #True
        EndIf
      EndIf
    EndIf
    CloseFile(File)
  EndIf
  
  ProcedureReturn Result
  
EndProcedure




If InitNetwork()
  
  Filename$ = OpenFileRequester("Chose a file to send", "", "*.*|*.*", 0)
  If Filename$ <> ""
    Connection = OpenNetworkConnection("127.0.0.1", 8080)
    If Connection
      If NetworkSendFile(Connection, Filename$)
        MessageRequester("Info", Filename$ + " transmitted.")
      Else
        MessageRequester("Error", "Failed to send " + Filename$)
      EndIf
      CloseNetworkConnection(Connection)
    EndIf
  EndIf
  
EndIf
And Server:

Code: Select all

Procedure.i NetworkReceiveFile(ClientID.i, *Buffer, RcvBytes.q, Path$="")
  
  Protected Line$, Filename$, FileSize.q, *NewBuffer, Count.i
  
  
  Line$ = PeekS(*Buffer, RcvBytes)
  If StringField(Line$, 1, ":") = "FILE"
    Filename$ = StringField(Line$, 2, ":")
    FileSize = Val(StringField(Line$, 3, ":"))
    
    If FileSize > 0
      
      RcvBytes - Len(Line$) - 1
      
      If Path$ = ""
        Path$ = PathRequester("Choose a directory", "")
      EndIf
      If Path$ <> ""
        File = CreateFile(#PB_Any, Path$ + Filename$)
        If File
          WriteData(File, *Buffer + Len(Line$) + 1, RcvBytes)
        EndIf
      EndIf
      
      Count = 0      
      While RcvBytes < FileSize And Count >= 0
        Count = ReceiveNetworkData(ClientID, *Buffer, MemorySize(*Buffer))
        If Count > 0
          If IsFile(File)
            WriteData(File, *Buffer, Count)
          EndIf
          RcvBytes + Count
        EndIf
      Wend
      
      If IsFile(File)
        If RcvBytes = FileSize
          Result = #True
        EndIf
        CloseFile(File)
      EndIf
      
    EndIf
  EndIf
    
  ProcedureReturn Result
  
EndProcedure



If InitNetwork()
  
  Server = CreateNetworkServer(#PB_Any, 8080)
  If Server
    
    Repeat
      
      SEvent = NetworkServerEvent()
  
      If SEvent
        ClientID = EventClient()
        If SEvent = #PB_NetworkEvent_Data
          
          *Buffer = AllocateMemory(1024)
          If *Buffer
            RcvBytes = ReceiveNetworkData(ClientID, *Buffer, 1024)
            
            If RcvBytes > 0
              
              Line$ = PeekS(*Buffer, 5)
              If Left(Line$, 5) = "FILE:"              
                If NetworkReceiveFile(ClientID, *Buffer, RcvBytes)
                  MessageRequester("Info", "File received")
                Else
                  MessageRequester("Error", "Error receiving file")
                EndIf
              Else
                
                ; do the other receive stuff
                MessageRequester("Info", "Received something, but no file")
                
              EndIf
              
            EndIf
            
            FreeMemory(*Buffer)
          EndIf
        EndIf
      Else
        Delay(10)
      EndIf
      
    ForEver
      
  EndIf
  
EndIf
Bernd

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Thu Jan 03, 2013 3:45 am
by sec
infratec wrote:Small example:

Client:

Code: Select all

Procedure.i NetworkSendFile(Connection.i, Filename$)
  
  Protected Result.i, File.i, Size.q, *Buffer, Offset.i
  
  
  File = ReadFile(#PB_Any, Filename$)
  If File
    Size = Lof(File)
    Filename$ = "FILE:" + GetFilePart(Filename$) + ":" + Str(Size)
    *Buffer =  AllocateMemory(Size + Len(Filename$) + 1)
    If *Buffer
      PokeS(*Buffer, Filename$)
      If ReadData(File, *Buffer + Len(Filename$) + 1, Size) = Size
        If SendNetworkData(Connection, *Buffer, MemorySize(*Buffer)) = MemorySize(*Buffer)
          Result = #True
        EndIf
      EndIf
    EndIf
    CloseFile(File)
  EndIf
  
  ProcedureReturn Result
  
EndProcedure




If InitNetwork()
  
  Filename$ = OpenFileRequester("Chose a file to send", "", "*.*|*.*", 0)
  If Filename$ <> ""
    Connection = OpenNetworkConnection("127.0.0.1", 8080)
    If Connection
      If NetworkSendFile(Connection, Filename$)
        MessageRequester("Info", Filename$ + " transmitted.")
      Else
        MessageRequester("Error", "Failed to send " + Filename$)
      EndIf
      CloseNetworkConnection(Connection)
    EndIf
  EndIf
  
EndIf
And Server:

Code: Select all

Procedure.i NetworkReceiveFile(ClientID.i, *Buffer, RcvBytes.q)
  
  Protected Line$, Filename$, FileSize.q, *NewBuffer, Count.i
  
  
  Line$ = PeekS(*Buffer, RcvBytes)
  If StringField(Line$, 1, ":") = "FILE"
    Filename$ = StringField(Line$, 2, ":")
    FileSize = Val(StringField(Line$, 3, ":"))
    
    If FileSize > 0
      
      RcvBytes - Len(Line$) - 1
      
      Path$ = PathRequester("Choose a directory", "")
      If Path$ <> ""
        File = CreateFile(#PB_Any, Path$ + Filename$)
        If File
          WriteData(File, *Buffer + Len(Line$) + 1, RcvBytes)
        EndIf
      EndIf
      
      Count = 0      
      While RcvBytes < FileSize And Count >= 0
        Count = ReceiveNetworkData(ClientID, *Buffer, MemorySize(*Buffer))
        If Count > 0
          If IsFile(File)
            WriteData(File, *Buffer, Count)
          EndIf
          RcvBytes + Count
        EndIf
      Wend
      
      If IsFile(File)
        If RcvBytes = FileSize
          Result = #True
        EndIf
        CloseFile(File)
      EndIf
      
    EndIf
  EndIf
    
  ProcedureReturn Result
  
EndProcedure



If InitNetwork()
  
  Server = CreateNetworkServer(#PB_Any, 8080)
  If Server
    
    Repeat
      
      SEvent = NetworkServerEvent()
  
      If SEvent
        ClientID = EventClient()
        If SEvent = #PB_NetworkEvent_Data
          
          *Buffer = AllocateMemory(1024)
          If *Buffer
            RcvBytes = ReceiveNetworkData(ClientID, *Buffer, 1024)
            
            If RcvBytes > 0
              
              Line$ = PeekS(*Buffer, 5)
              If Left(Line$, 5) = "FILE:"              
                If NetworkReceiveFile(ClientID, *Buffer, RcvBytes)
                  MessageRequester("Info", "File received")
                Else
                  MessageRequester("Error", "Error receiving file")
                EndIf
              Else
                
                ; do the other receive stuff
                MessageRequester("Info", "Received something, but no file")
                
              EndIf
              
            EndIf
            
            FreeMemory(*Buffer)
          EndIf
        EndIf
      Else
        Delay(10)
      EndIf
      
    ForEver
      
  EndIf
  
EndIf
Bernd
@infratec: Thanks much Bernd, it works :D

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Thu Jan 03, 2013 8:08 pm
by infratec
Hi,

I changed the NetworkReceiveFile() procedure above.
I added a Path$ parameter with default "".

Now you can decide if you want to open the PathRequester()
or simply to store the received file in a default directory.

Bernd

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Thu Jan 03, 2013 11:13 pm
by infratec
Hm, I can not stop :)

I modified the NetworkReceiveFile() procedure to allow receive to memory.

If the Path$ parameter is "MEMORY" the received file will be hold in memory.
The Result is than a valid memory pointer.
You have to free the memory by yourself.
The filesize can be obtained by MemorySize().

Here it is:

Code: Select all

EnableExplicit


;
; if Path$ is empty (default), than the PathRequester() is called
; if Path$ is a path to a directory, the file will be stored in that one
; if Path$ = MEMORY, than the file is stored in memory.
; the Result is than a valid memory pointer. 
; You have to free the memory yourself.
;

Procedure.i NetworkReceiveFile(ClientID.i, *Buffer, RcvBytes.q, Path$="")
  
  Protected Result.i, Line$, Filename$, File.i, FileSize.q, Count.i
  
  
  Line$ = PeekS(*Buffer, RcvBytes)
  If StringField(Line$, 1, ":") = "FILE"
    Filename$ = StringField(Line$, 2, ":")
    FileSize = Val(StringField(Line$, 3, ":"))
    
    If FileSize > 0
      
      RcvBytes - Len(Line$) - 1
      
      If Path$ = "" : Path$ = PathRequester("Choose a directory", "") : EndIf
      
      If Path$ <> ""
        If Path$ = "MEMORY"
          Result = AllocateMemory(FileSize)
          If Result : CopyMemory(*Buffer + Len(Line$) + 1, Result, RcvBytes) : EndIf
        Else
          File = CreateFile(#PB_Any, Path$ + Filename$)
          If File : WriteData(File, *Buffer + Len(Line$) + 1, RcvBytes) : EndIf
        EndIf
      EndIf
      
      Count = 0      
      While RcvBytes < FileSize And Count >= 0
        Count = ReceiveNetworkData(ClientID, *Buffer, MemorySize(*Buffer))
        If Count > 0
          If IsFile(File) : WriteData(File, *Buffer, Count) : EndIf
          If Result : CopyMemory(*Buffer, Result + RcvBytes, Count) : EndIf
          RcvBytes + Count
        EndIf
      Wend
      
      If Result
        If RcvBytes <> FileSize
          FreeMemory(Result)
          Result = #False
        EndIf
      EndIf
      
      If IsFile(File)
        If RcvBytes = FileSize
          Result = #True
        EndIf
        CloseFile(File)
      EndIf
      
    EndIf
  EndIf
    
  ProcedureReturn Result
  
EndProcedure




Define Server.i, SEvent.i, ClientID.i, *Buffer, RcvBytes.i, Line$, Result.i


If InitNetwork()
  
  Server = CreateNetworkServer(#PB_Any, 8080)
  If Server
    
    Repeat
      
      SEvent = NetworkServerEvent()
  
      If SEvent
        ClientID = EventClient()
        If SEvent = #PB_NetworkEvent_Data
          
          *Buffer = AllocateMemory(1024)
          If *Buffer
            RcvBytes = ReceiveNetworkData(ClientID, *Buffer, 1024)
            
            If RcvBytes > 0
              
              Line$ = PeekS(*Buffer, 5)
              If Left(Line$, 5) = "FILE:"
                Result = NetworkReceiveFile(ClientID, *Buffer, RcvBytes, "MEMORY")
                If Result
                  Debug MemorySize(Result)
                  Debug PeekS(Result, MemorySize(Result))
                  FreeMemory(Result)
                  MessageRequester("Info", "File received")
                Else
                  MessageRequester("Error", "Error receiving file")
                EndIf
              Else
                
                ; do the other receive stuff
                MessageRequester("Info", "Received something, but no file")
                
              EndIf
              
            EndIf
            
            FreeMemory(*Buffer)
          EndIf
        EndIf
      Else
        Delay(10)
      EndIf
      
    ForEver
      
  EndIf
  
EndIf
Have fun,

Bernd

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Posted: Fri Jan 04, 2013 3:36 am
by sec
infratec wrote:Hm, I can not stop :)

I modified the NetworkReceiveFile() procedure to allow receive to memory.

If the Path$ parameter is "MEMORY" the received file will be hold in memory.
The Result is than a valid memory pointer.
You have to free the memory by yourself.
The filesize can be obtained by MemorySize().

Here it is:

Code: Select all

EnableExplicit


;
; if Path$ is empty (default), than the PathRequester() is called
; if Path$ is a path to a directory, the file will be stored in that one
; if Path$ = MEMORY, than the file is stored in memory.
; the Result is than a valid memory pointer. 
; You have to free the memory yourself.
;

Procedure.i NetworkReceiveFile(ClientID.i, *Buffer, RcvBytes.q, Path$="")
  
  Protected Result.i, Line$, Filename$, File.i, FileSize.q, Count.i
  
  
  Line$ = PeekS(*Buffer, RcvBytes)
  If StringField(Line$, 1, ":") = "FILE"
    Filename$ = StringField(Line$, 2, ":")
    FileSize = Val(StringField(Line$, 3, ":"))
    
    If FileSize > 0
      
      RcvBytes - Len(Line$) - 1
      
      If Path$ = "" : Path$ = PathRequester("Choose a directory", "") : EndIf
      
      If Path$ <> ""
        If Path$ = "MEMORY"
          Result = AllocateMemory(FileSize)
          If Result : CopyMemory(*Buffer + Len(Line$) + 1, Result, RcvBytes) : EndIf
        Else
          File = CreateFile(#PB_Any, Path$ + Filename$)
          If File : WriteData(File, *Buffer + Len(Line$) + 1, RcvBytes) : EndIf
        EndIf
      EndIf
      
      Count = 0      
      While RcvBytes < FileSize And Count >= 0
        Count = ReceiveNetworkData(ClientID, *Buffer, MemorySize(*Buffer))
        If Count > 0
          If IsFile(File) : WriteData(File, *Buffer, Count) : EndIf
          If Result : CopyMemory(*Buffer, Result + RcvBytes, Count) : EndIf
          RcvBytes + Count
        EndIf
      Wend
      
      If Result
        If RcvBytes <> FileSize
          FreeMemory(Result)
          Result = #False
        EndIf
      EndIf
      
      If IsFile(File)
        If RcvBytes = FileSize
          Result = #True
        EndIf
        CloseFile(File)
      EndIf
      
    EndIf
  EndIf
    
  ProcedureReturn Result
  
EndProcedure




Define Server.i, SEvent.i, ClientID.i, *Buffer, RcvBytes.i, Line$, Result.i


If InitNetwork()
  
  Server = CreateNetworkServer(#PB_Any, 8080)
  If Server
    
    Repeat
      
      SEvent = NetworkServerEvent()
  
      If SEvent
        ClientID = EventClient()
        If SEvent = #PB_NetworkEvent_Data
          
          *Buffer = AllocateMemory(1024)
          If *Buffer
            RcvBytes = ReceiveNetworkData(ClientID, *Buffer, 1024)
            
            If RcvBytes > 0
              
              Line$ = PeekS(*Buffer, 5)
              If Left(Line$, 5) = "FILE:"
                Result = NetworkReceiveFile(ClientID, *Buffer, RcvBytes, "MEMORY")
                If Result
                  Debug MemorySize(Result)
                  Debug PeekS(Result, MemorySize(Result))
                  FreeMemory(Result)
                  MessageRequester("Info", "File received")
                Else
                  MessageRequester("Error", "Error receiving file")
                EndIf
              Else
                
                ; do the other receive stuff
                MessageRequester("Info", "Received something, but no file")
                
              EndIf
              
            EndIf
            
            FreeMemory(*Buffer)
          EndIf
        EndIf
      Else
        Delay(10)
      EndIf
      
    ForEver
      
  EndIf
  
EndIf
Have fun,

Bernd

Nice Bernd :D

I modified to make it simpler:

Code: Select all

Procedure.i ReceiveNetworkFile(ClientID.i, Filename$)
  
  Protected Size.q, Count.i, *Buffer, RcvBytes.q
  
  *Buffer = AllocateMemory(1024, #PB_Memory_NoClear)
  If *Buffer
    RcvBytes = ReceiveNetworkData(ClientID, *Buffer, 1024)
    
    If RcvBytes > 0
      Size = PeekQ(*Buffer)
      
      If Size > 0
        
        RcvBytes - SizeOf(Size)
        
        File = CreateFile(#PB_Any, Filename$)
        If File
          WriteData(File, *Buffer + SizeOf(Size), RcvBytes)
        EndIf
        
        Count = 0     
        While RcvBytes < Size And Count >= 0
          Count = ReceiveNetworkData(ClientID, *Buffer, 1024)
          If Count > 0
            If IsFile(File)
              WriteData(File, *Buffer, Count)
            EndIf
            RcvBytes + Count
          EndIf
        Wend
        
        If IsFile(File)
          If RcvBytes = Size
            Result = #True
          EndIf
          CloseFile(File)
        EndIf
        
      EndIf
      
    EndIf
    
    FreeMemory(*Buffer)
  EndIf  
  
  ProcedureReturn Result
  
EndProcedure
Procedure.i SendNetworkFile(ClientID.i, Filename$)
  
  Protected Result.i, File.i, Size.q, *Buffer
  
  File = ReadFile(#PB_Any, Filename$)
  If File
    Size = Lof(File)
    SizeBuffer = Size + SizeOf(Size)
    *Buffer =  AllocateMemory(SizeBuffer, #PB_Memory_NoClear)
    If *Buffer
      PokeQ(*Buffer, Size)
      If ReadData(File, *Buffer + SizeOf(Size), Size) = Size
        If SendNetworkData(ClientID, *Buffer, SizeBuffer) = SizeBuffer
          Result = #True
        EndIf
      EndIf
    EndIf
    CloseFile(File)
  EndIf
  
  ProcedureReturn Result
  
EndProcedure