#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