How send file using ReceiveNetworkData/SendNetworkData ?

Just starting out? Need help? Post your questions and find answers here.
sec
Enthusiast
Enthusiast
Posts: 792
Joined: Sat Aug 09, 2003 3:13 am
Location: 90-61-92 // EU or ASIA
Contact:

How send file using ReceiveNetworkData/SendNetworkData ?

Post by sec »

Have you example for using ReceiveNetworkData/SendNetworkData to send/receive one file?

Thanks much.
User avatar
STARGÅTE
Addict
Addict
Posts: 2226
Joined: Thu Jan 10, 2008 1:30 pm
Location: Germany, Glienicke
Contact:

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Post 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Lizard - Script language for symbolic calculations and moreTypeface - Sprite-based font include/module
infratec
Always Here
Always Here
Posts: 7575
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Post 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
Last edited by infratec on Thu Jan 03, 2013 8:06 pm, edited 1 time in total.
sec
Enthusiast
Enthusiast
Posts: 792
Joined: Sat Aug 09, 2003 3:13 am
Location: 90-61-92 // EU or ASIA
Contact:

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Post 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
infratec
Always Here
Always Here
Posts: 7575
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Post 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
infratec
Always Here
Always Here
Posts: 7575
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Post 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
sec
Enthusiast
Enthusiast
Posts: 792
Joined: Sat Aug 09, 2003 3:13 am
Location: 90-61-92 // EU or ASIA
Contact:

Re: How send file using ReceiveNetworkData/SendNetworkData ?

Post 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
Post Reply