'##############################################################################################################
#DEFINE TSNE_SUBCALLBACK
#INCLUDE Once "TSNE_V3.bi"
'##############################################################################################################
Type Client_Type
V_Next As Client_Type Ptr
V_Prev As Client_Type Ptr
V_TSNEID As Uinteger
V_IPA As String
V_Data As String
End Type
'--------------------------------------------------------------------------------------------------------------
Dim Shared G_ClientF As Client_Type Ptr
Dim Shared G_ClientL As Client_Type Ptr
Dim Shared G_ClientMux As Any Ptr
'##############################################################################################################
Sub SendToAll(V_Data As String)
Mutexlock(G_ClientMux)
Dim TPtr As Client_Type Ptr = G_ClientF
Do Until TPtr = 0
TSNE_Data_Send(TPtr->V_TSNEID, V_Data)
TPtr = TPtr->V_Next
Loop
Mutexunlock(G_ClientMux)
End Sub
'##############################################################################################################
Sub TSNE_Disconnected(Byval V_TSNEID As Uinteger, Byval V_CallBackPtr As Client_Type Ptr)
If V_CallBackPtr = 0 Then Exit Sub
Print "[CLIENT] Disconnected: " & V_TSNEID & " " & V_CallBackPtr->V_IPA
Mutexlock(G_ClientMux)
Dim TPtr As Client_Type Ptr = G_ClientF
Do Until TPtr = 0
If TPtr = V_CallBackPtr Then
If TPtr->V_Next <> 0 Then TPtr->V_Next->V_Prev = TPtr->V_Prev
If TPtr->V_Prev <> 0 Then TPtr->V_Prev->V_Next = TPtr->V_Next
If G_ClientF = TPtr Then G_ClientF = TPtr->V_Next
If G_ClientL = TPtr Then G_ClientL = TPtr->V_Prev
Exit Do
End If
TPtr = TPtr->V_Next
Loop
Mutexunlock(G_ClientMux)
Deallocate(V_CallBackPtr)
End Sub
'##############################################################################################################
Sub TSNE_Connected(Byval V_TSNEID As Uinteger, Byval V_CallBackPtr As Client_Type Ptr)
If V_CallBackPtr = 0 Then TSNE_Disconnect(V_TSNEID): Exit Sub
Print "[CLIENT] Connected: " & V_TSNEID & " " & V_CallBackPtr->V_IPA
End Sub
'##############################################################################################################
Sub TSNE_NewData(Byval V_TSNEID As Uinteger, Byref V_Data As String, Byval V_CallBackPtr As Client_Type Ptr)
If V_CallBackPtr = 0 Then TSNE_Disconnect(V_TSNEID): Exit Sub
With *V_CallBackPtr
.V_Data += V_Data
Print "[CLIENT] DATA: " & V_TSNEID & " " & .V_IPA & " DataLen:"; Len(.V_Data)
'Nur zu dem clienten senden, vond em wir daten empfangen haben
TSNE_Data_Send(V_TSNEID, "Habe daten von dir empfangen!")
'zu allen clienten senden
SendToAll("Hab von " & .V_IPA & " datenempfangen!")
.V_Data = ""
End With
End Sub
'##############################################################################################################
Sub TSNE_NewConnection(Byval V_TSNEID As Uinteger, Byval V_RequestID As Socket, Byval V_IPA As String)
Dim TNewTSNEID As Uinteger
Dim TClient As Client_Type Ptr = Callocate(Sizeof(Client_Type))
TClient->V_IPA = V_IPA
Mutexlock(G_ClientMux)
Dim RV As Integer = TSNE_Create_Accept(V_RequestID, TNewTSNEID, , @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData, , , , Cast(Any Ptr, TClient))
If RV <> TSNE_Const_NoError Then
Deallocate(TClient)
Print "[CLIENT] [FEHLER] " & TSNE_GetGURUCode(RV)
Exit Sub
End If
If G_ClientL <> 0 Then
G_ClientL->V_Next = TClient
G_ClientL->V_Next->V_Prev = G_ClientL
G_ClientL = G_ClientL->V_Next
Else
G_ClientL = TClient
G_ClientF = G_ClientL
End If
With *G_ClientL
.V_TSNEID = TNewTSNEID
.V_IPA = V_IPA
End With
Mutexunlock(G_ClientMux)
Print "[CLIENT] New Connect: " & TNewTSNEID & " " & V_IPA
End Sub
'##############################################################################################################
G_ClientMux = Mutexcreate()
Dim TServerID As Uinteger
Dim RV As Integer = TSNE_Create_Server(TServerID, 1234, 10, @TSNE_NewConnection)
If RV <> TSNE_Const_NoError Then
Print "[SERVER] [FEHLER] " & TSNE_GetGURUCode(RV)
End 0
End If
Print "[SERVER] OK!"
Do
Sleep 10, 1
Loop Until Inkey() = Chr(27)
RV = TSNE_Disconnect(TServerID)
TSNE_WaitClose(TServerID)
Mutexdestroy(G_ClientMux)
End 0