Page 2 of 2
Re: Module NetworkData - Send strings and data over 64kb
Posted: Sun Sep 10, 2017 1:32 pm
by mk-soft
Update v1.15
- Added: SetAESData (...). Send data encrypted.
- Added: SetUserData (...) and GetUserData (...) for each Connection.
Note UserData!
Access to the UserData is only possible within the NewDataCallback since each server or client has its own environment (threaded).
If a *pointer is used on your own data, you may have to release it again at event #PB_NetworkEvent_Disconnect.

Re: Module NetworkData - Send strings and data over 64kb
Posted: Sun Mar 04, 2018 1:56 pm
by mk-soft
Update v1.18
- Added some Mutex
- Optimize code
- Update examples server and client
Re: Module NetworkData - Send strings and data over 64kb
Posted: Mon Aug 27, 2018 11:12 am
by mk-soft
Update v1.21
- Fixed SendList: Now ClearList on exists DataSet
- Optimize: Protocol header and data block are now also encrypted
Update examples too

Re: Module NetworkData - Send strings and data over 64kb
Posted: Tue Aug 28, 2018 3:57 pm
by mk-soft
Update v1.23
- Fixed MacOS - App Nap: Process go not longer to sleep. Thank to Danilo and Wilbert
- DataSet now intern a pointer to structure. We can free dataset later with new function FreeDataSet(...)
- Added: FreeDataSet(...)
- Remove: CopyDataSet(...)
- Added new constants for result of Callback
-- #NetResult ; Hold DataID and DataSet
-- #NetResultFreeData ; Free DataID and DataSet
-- #NetResultFreeDataWithoutDataSet ; Free DataID without DataSet
Thanks to Danilo and Wilbert for deactivate AppNap (MacOS)

Re: Module NetworkData - Send strings and data over 64kb
Posted: Thu Aug 12, 2021 8:02 am
by novablue
Sorry for digging up an old thread but i find this module really useful so thanks for sharing this with us!
The only issue i am having with it is that sending data or files is very slow and nowhere near exceeding my upload bandwidth, it is sending at a speed of roughly 50kb/s out of the 1mb/s upload bandwidth that i have. Does anyone have an idea why this could be and if it can be improved? Or could this be an limitation with the pb network lib itself?
Re: Module NetworkData - Send strings and data over 64kb
Posted: Mon Jan 24, 2022 1:27 am
by novablue
I have been using this for a long time now and i am still getting occasional crashes on SendNetworkData (particulary in the SendString() procedure). Any idea why this happens or how this could be fixed? From what i can tell SendNetworkData is being locked with a mutex so it should not happen but yet it does when run in a thread.
Re: Module NetworkData - Send strings and data over 64kb
Posted: Mon Jan 24, 2022 9:46 am
by Bitblazer
@novablue
Maybe it is time to test it with the new PB 6 C backend. Bug fixing seems to be focussed there right now.
Make a minimal example and do a bug report. If it happens in windows - use
WinAPIOverride to trace where exactly the crash happens. If you can trigger it in linux, use
dmesg or something similar, the name can differ depending on the distribution.
Does it happen if you disable virtual memory? Did you do a memory / hardware / CPU test? I have had problems with VMM paging of large memory areas in the past, but that had to do with hardware or VMM driver bugs. Did you try software like
CPU-Z,
MemTest86 or
AIDA64 to thoroughly test your hardware?
Does it depend on the involved devices? Does it happen with other software too?
Re: Module NetworkData - Send strings and data over 64kb
Posted: Tue Jan 25, 2022 12:16 am
by novablue
It is hard to make an example. i am using this include in a large project and then just sometimes the program will IMA randomly on SendNetworkData. I am pretty sure it is because of threads being used and not necessarily because this include has a bug. From my experience using threads in PureBasic no matter how well written it will crash sooner than later. It cant be my system either I am running my program using this include on many different computers and on all it will just crash occasionally. I will try the new c back end soon if that makes any difference.
Re: Module NetworkData - Send strings and data over 64kb
Posted: Tue Jan 25, 2022 9:41 am
by mk-soft
@novablue
I assume that you have set the compiler option 'ThreadSafe' in the main file. Only with this option string are thread safe.
Re: Module NetworkData - Send strings and data over 64kb
Posted: Wed Jan 26, 2022 12:58 am
by novablue
mk-soft wrote: Tue Jan 25, 2022 9:41 am
@novablue
I assume that you have set the compiler option 'ThreadSafe' in the main file. Only with this option string are thread safe.
Yes i have ThreadSafe mode on, i will investigate stability further with the new c back end.
I have some side questions that don't really have anything to do with this include but they might be fitting here:
On windows is there any way to close a stuck network connection on the server side? For example: a client connects to the server and the clients internet connection gets cut off. On the server the #PB_NetworkEvent_Disconnect event will not happen sometimes and the client will be stuck forever it seems. I can use a ping / pong method to test if the client still responds and then ignore lost connections but Is there any way to actually close the client connection manually server sided?
My second question: Is it possible to verify if a connection handle is still valid? Something like isConnection() would be really useful... "ConnectionID()" will return an unique system identifier maybe there is a way with Winapi to check if that handle is still valid?
Re: Module NetworkData - Send strings and data over 64kb
Posted: Wed Jan 26, 2022 2:30 pm
by mk-soft
You can also close a connection on the server side. The PB function CloseNetwerkConnection also works on the server side. Even the event PB_Event_Disconnet arrives at the client most of the time, even if it is not described in the PB help.
However, it is not yet implemented in the module that the server disconnects a single connection.
A timeout monitoring must still be programmed in the server thread for this. If no data comes from the client after time x, the connection could be disconnected from the server. However, the client must at least send data after time x or a Lifetelegram .
Re: Module NetworkData - Send strings and data over 64kb
Posted: Thu Jan 27, 2022 10:51 am
by novablue
mk-soft wrote: Wed Jan 26, 2022 2:30 pm
You can also close a connection on the server side. The PB function CloseNetwerkConnection also works on the server side. Even the event PB_Event_Disconnet arrives at the client most of the time, even if it is not described in the PB help.
However, it is not yet implemented in the module that the server disconnects a single connection.
A timeout monitoring must still be programmed in the server thread for this. If no data comes from the client after time x, the connection could be disconnected from the server. However, the client must at least send data after time x or a Lifetelegram .
OK thanks i did not know CloseNetwerkConnection works server sided. I tried to implement it myself and it seems to be working. For now the pinging/timeout is handled by my program itself, maybe adding it internally to the module would be better in the future. If you have a better way of doing this please let me know.
Code: Select all
Structure udtServerList
ServerID.i
ThreadID.i
ExitServer.i
CloseClientConnection.i ; New Added Changes
NewDataCB.ProtoNewDataCB
EndStructure
Procedure ServerCloseClientConnnection(ServerID, ConnectionID) ; New Added Changes
Protected keyServerID.s = Hex(ServerID)
If (FindMapElement(ServerList(), keyServerID))
While (ServerList(keyServerID)\CloseClientConnection) : Delay(10) : Wend
ServerList(keyServerID)\CloseClientConnection = ConnectionID
EndIf
EndProcedure
Procedure ThreadServer(*this.udtServerList)
Protected Event, ConnectionID, keyConnectionID.s, count
With *this
Repeat
LockMutex(LockServer)
Event = NetworkServerEvent(\ServerID)
If (Event)
ConnectionID = EventClient()
EndIf
; New Added Changes
If (\CloseClientConnection)
keyConnectionID = Hex(\CloseClientConnection)
If (FindMapElement(DataConnection(), keyConnectionID))
CloseNetworkConnection(DataConnection()\ConnectionID)
If (\NewDataCB)
\NewDataCB(#PB_NetworkEvent_Disconnect, DataConnection()\ConnectionID, 0)
EndIf
ForEach DataConnection()\DataPacket()
FreeDataPacket(DataConnection()\DataPacket())
Next
DeleteMapElement(DataConnection(), keyConnectionID)
EndIf
\CloseClientConnection = #False
EndIf
; New Added Changes ^^
UnlockMutex(LockServer)
Select (Event)
Case #PB_NetworkEvent_Connect
; Create DataConnection
keyConnectionID = Hex(ConnectionID)
If (FindMapElement(DataConnection(), keyConnectionID))
ForEach DataConnection()\DataPacket()
FreeDataPacket(DataConnection()\DataPacket())
Next
DeleteMapElement(DataConnection(), keyConnectionID)
Else
AddMapElement(DataConnection(), keyConnectionID)
DataConnection()\ConnectionID = ConnectionID
; Logging("Network: Client connected: ID " + IPString(GetClientIP(ConnectionID)))
EndIf
If (\NewDataCB)
\NewDataCB(#PB_NetworkEvent_Connect, ConnectionID, 0)
EndIf
Case #PB_NetworkEvent_Data
ReceiveData(ConnectionID,\NewDataCB)
Case #PB_NetworkEvent_Disconnect
; Destroy DataConnection
keyConnectionID = Hex(ConnectionID)
; Logging("Network: Client disconnected: ID " + keyConnectionID)
If (\NewDataCB)
\NewDataCB(#PB_NetworkEvent_Disconnect, ConnectionID, 0)
EndIf
If (FindMapElement(DataConnection(), keyConnectionID))
ForEach DataConnection()\DataPacket()
FreeDataPacket(DataConnection()\DataPacket())
Next
DeleteMapElement(DataConnection(), keyConnectionID)
EndIf
Default
Delay(20)
EndSelect
Until (\ExitServer)
; Clear all DataConnection. We can delete all the data, because each server have their own DataConnection. DataConnection is threaded
ForEach DataConnection()
If (\NewDataCB)
\NewDataCB(#PB_NetworkEvent_Disconnect, DataConnection()\ConnectionID, 0)
EndIf
ForEach DataConnection()\DataPacket()
FreeDataPacket(DataConnection()\DataPacket())
Next
ClearMap(DataConnection()\DataPacket())
Next
ClearMap(DataConnection())
; Exit Thread
\ExitServer = 0
EndWith
EndProcedure