#DEFINE TSNE_SUBCALLBACK 'eine variante in TSNE, um CallbackPointer in den Callbacks nutzen zu können
#INCLUDE "TSNE_V3.bi"
Type UserUDT
V_Zahl As Integer
V_Input As String
End Type
Sub TSNE_Disconnected(Byval V_TSNEID As Uinteger, Byval V_CallBackPtr As UserUDT Ptr)
If V_CallBackPtr = 0 Then Exit Sub
Deallocate(V_CallBackPtr) 'Den Temporär erzeugten Speicher für diese Verbindung wieder löschen
End Sub
Sub TSNE_NewData (Byval V_TSNEID As Uinteger , Byref V_Data As String, Byval V_CallBackPtr As UserUDT Ptr)
If V_CallBackPtr = 0 Then Exit Sub
With *V_CallBackPtr 'Wir greifen auf die Datenstruktur des Pointers zu.
For X As Uinteger = 1 To Len(V_Data) 'die eingabe Byte für Byte verarbeiten
Select Case V_Data[X - 1]
Case 8 'rückschritt
.V_Input = Mid(.V_Input, Len(.V_Input) - 1)
Case 10, 13 'enter
If .V_Input <> "" Then 'wenn eingabe nicht leer
TSNE_DATA_SEND V_TSNEID, Chr(13, 10)
If .V_Zahl > Val(.V_Input) Then 'wenn eingabe kleine
TSNE_DATA_SEND V_TSNEID, Chr(13, 10) & "zu klein" & Chr(13, 10)
Elseif .V_Zahl < Val(.V_Input) Then 'wenn eingabe größer
TSNE_DATA_SEND V_TSNEID, Chr(13, 10) & "zu gross" & Chr(13, 10)
Else 'wenn gleich gross
TSNE_DATA_SEND V_TSNEID, Chr(13, 10) & Str(.V_Zahl) & " ist richtig" & Chr(13, 10)
.V_Zahl = -1
TSNE_DATA_SEND V_TSNEID, Chr(13, 10) & "Noch eine Runde? [j / n]" & Chr(13, 10)
End If
Print "ID:"; V_TSNEID; " Zahl:"; .V_Zahl; " Eingabe:"; .V_Input
.V_Input = ""
End If
Case 48 To 57 'zahlen hinzufügen
.V_Input += Chr(V_Data[X - 1])
Case 106 'j
If .V_Zahl = -1 Then 'nur dann eine neue zahl erzeugen, wenn diese erraten wurde
.V_Zahl = Int((Rnd * 1000) + 1)
TSNE_DATA_SEND V_TSNEID, Chr(13, 10)
TSNE_DATA_SEND V_TSNEID, "Nächste Zahl bereit!" & Chr(13, 10)
End If
Case 110 'n
If .V_Zahl = -1 Then 'nur dann eine neue zahl erzeugen, wenn diese erraten wurde
TSNE_Disconnect(V_TSNEID)
Exit Sub
End If
Case 113 'q (exit)
TSNE_Disconnect(V_TSNEID)
Exit Sub
End Select
Next
End With
End Sub
Sub TSNE_NewConnection(Byval V_TSNEID As Uinteger , Byval V_RequestID As Socket , Byval V_IPA As String)
Dim TPtr As UserUDT Ptr
Dim NewTSNEID As Uinteger
Dim RV As Integer
TPtr = Callocate(Sizeof(UserUDT)) 'Einen neuen Speicher für diese Verbindung erzugen. Diese hält spter alle infos des users
TPtr->V_Zahl = Int((Rnd * 1000) + 1) 'Nach dem erzeugen des Speichers, können wir eine Zufallszahl festlegen
RV = TSNE_Create_Accept(V_RequestID, NewTSNEID, , @TSNE_Disconnected, 0, @TSNE_NewData, , , , TPtr) 'Hier übergeben wir den SpeicherPointer an die Callbackstrukturen
If RV <> TSNE_Const_NoError Then
Deallocate(TPtr) 'Wenn ein Fehler aufgetreten ist, müssen wir auch den Speicher wieder löschen
Print "[ACCEPT] [FEHLER] " & TSNE_GetGURUCode(RV)
Exit Sub
End If
Print NEWTSNEID
'umgehen von telnet-kommandos. Es wird 1sek. gewartet, bis alle steuerbefehler eingegangen sind.
'dann wird der eingangsspeicher geleert.
Sleep 1000, 1
TPtr->V_Input = ""
TSNE_DATA_SEND NewTSNEID , "Herzlich Wilkommen" & Chr (13 , 10) & _
"Rate eine Zahl zwischen 1 und 1000" & Chr (13 , 10)
End Sub
Randomize Timer
Dim G_Server_TSNEID As Uinteger
Dim RV As Integer
Print "Create Server..."
Do
RV = TSNE_Create_Server(G_Server_TSNEID , 48660 , 100 , @TSNE_NewConnection , 0)
If RV = TSNE_Const_NoError Then Exit Do
Sleep 1000, 1
Loop
Print "running"
Do Until Inkey() = Chr(27)
Sleep 1, 1
Loop
Print "exiting..."
TSNE_Disconnect(G_Server_TSNEID)
TSNE_WaitClose(G_Server_TSNEID)
End 0