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
EndIf
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
Last edited by infratec on Thu Jan 03, 2013 8:06 pm, edited 1 time in total.
-
- 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 EndIf
BerndCode: 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
EndIf
Bernd
-
- 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