How send file using ReceiveNetworkData/SendNetworkData ?
Posted: Wed Jan 02, 2013 11:04 am
Have you example for using ReceiveNetworkData/SendNetworkData to send/receive one file?
Thanks much.
Thanks much.
http://www.purebasic.com
https://www.purebasic.fr/english/
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
@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
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
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
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