Have you example for using ReceiveNetworkData/SendNetworkData to send/receive one file?
Thanks much.
			
			
									
									
						How send file using ReceiveNetworkData/SendNetworkData ?
Re: How send file using ReceiveNetworkData/SendNetworkData ?
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.
			
			
									
									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 more ― Typeface - Sprite-based font include/module
						Lizard - Script language for symbolic calculations and more ― Typeface - Sprite-based font include/module
Re: How send file using ReceiveNetworkData/SendNetworkData ?
Small example:
Client:And Server:
Bernd
			
			
													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
  
EndIfCode: 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
					Last edited by infratec on Thu Jan 03, 2013 8:06 pm, edited 1 time in total.
									
			
									
						- 
				sec
 - 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 ?
@infratec: Thanks much Bernd, it worksinfratec wrote:Small example:
Client:And Server: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 EndIfBerndCode: 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
Re: How send file using ReceiveNetworkData/SendNetworkData ?
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
			
			
									
									
						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 ?
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:
Have fun,
Bernd
			
			
									
									
						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
  
EndIfBernd
- 
				sec
 - 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 ?
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:Have fun,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
Bernd
Nice Bernd
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
