fb:porticula NoPaste
test_server.bas
Uploader: | ThePuppetMaster |
Datum/Zeit: | 16.09.2008 12:44:52 |
'##############################################################################################################
'TEST-SERVER für TSNE Version 2
'##############################################################################################################
'##############################################################################################################
' Die TCP Netzwerkbibliotek integrieren
#include once "TSNE_V2.bi"
'##############################################################################################################
' Eine Variable für den Server-Handel erstellen
Dim G_Server as UInteger
' Jeder Server kann!! eine BlackListe nutzen. Diese Konstante aktiviert in unserem Beispiel
' die BlackListe. Die Variable regelt hier die Aktivierung der Blackliste in den folgenden
' Codezeilen. Die BlackList ist durch die Kommandos "TSNE_BlackList_xxx" zu identifizieren.
' Der Wert 1 steht hier für Aktivierte Blackliste.
' Die BlackList in unserem Beispiel läst die erste Verbindung zu. Danach werden alle Verbindugnen
' dieser IP automatisch Blockiert.
' Wer das beispiel ohne BlackList Funktion testen möchte, kann hier eine 0 schreiben.
Const G_UseBlackList as UInteger = 1
'##############################################################################################################
' Deklarationen für die Empfänger Sub Routinen erstellen
Declare Sub TSNE_Disconnected (ByVal V_TSNEID as UInteger)
Declare Sub TSNE_Connected (ByVal V_TSNEID as UInteger)
Declare Sub TSNE_NewData (ByVal V_TSNEID as UInteger, ByRef V_Data as String)
Declare Sub TSNE_NewConnection (ByVal V_TSNEID as UInteger, ByVal V_RequestID as Socket, ByVal V_IPA as String)
Declare Sub TSNE_NewConnectionCanceled (ByVal V_TSNEID as UInteger, ByVal V_IPA as String)
'##############################################################################################################
' Programm beginnen
Print "[INIT] Setup..."
' Wir schalten die Nutzung der BlackList ein
TSNE_BlackList_Use_Global(1)
' Variable für die Statusrückgabe (GURUID) erstellen
Dim BV as Long
' Server etablieren und Pointer der Empfänger Sub Routinen übergeben.
' unerwünschte Routinen können mit '0' angegeben werden. Diese werden
' anschliessend vom TSNE_Modul ignoriert, udn nicht gefeuert.
' Zwingend nötig ist jedoch die NewConnection Routine. da sie die
' eigentlichen Verbindungswünsche entgegen nimmt.
' Als Portnummer geben wir hier 1234 an und teilen dem Modul mit, das wir
' maximal 10 Parallele Verbindungswünsche gleichzeitig zwischenspeichern möchten.
' 10 ist ein Relativer wert, und ist von System zu System unterschiedlich.
' Der Wert legt eigentlich nur fest, wie viele Benutzer eine Verbindugn wünschen
' klnnen, wärend wir in der newConnection Routine eine neue Verbindugnsanfrage
' bearbeiten. Es sollte daher in dieser Routine so wenig wie möglich Code-Stehen
' um die Bufferauslastung so gering wie möglich zu halten.
BV = TSNE_Create_Server(G_Server, 1234, 10, @TSNE_NewConnection, @TSNE_NewConnectionCanceled)
' Statusrückgabe auswerten
If BV = 0 Then
' Wir schalten die BlackListe für diesen Server ein.
TSNE_BlackList_Use(G_Server, 1)
' Der Server arbeitet jetzt korreckt, und wartet auf eingehende Verbindungsanfragen.
Print "[OK]"
Print "[WAIT] ..."
' Hier warten wir darauf, das der Benutzer ein "ESC" Drückt. Anschliessend wir die Do-Loop verlassen.
Do
Sleep 1, 1
Loop until InKey() = Chr(27)
' Nachdem die schleife verlasen wurde, werden wir das Programm beenden.
Print "[WAIT] OK"
Print "[DISCCONNECTING]"
' Dazu schliessen wir zuerst die Serververbindung, um weitere, neue Verbindungswünsche zu unterdrücken
TSNE_Disconnect(G_Server)
Print "[DISCCONNECTING] Wait..."
' jetzt warten wir darauf, das die verbindung vollständig beendet wird.
TSNE_WaitClose(G_Server)
Print "[DISCCONNECTING] OK"
Else: Print "[FEHLER] " & TSNE_GetGURUCode(BV)
End if
' Zu guter letzt beenden wir das Programm.
Print "[END]"
End
'##############################################################################################################
' Empfänger für das Disconnect Signal (Verbindung beendet)
Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger)
' Nach dem Empfang dieses Events sind keine Weiteren Operationen mehr auf diese
' Verbindungsnummer (TSNEID) möglich. Das Schliesst ein weiteres TSNE_Disconnect,
' TSNE_Data_Send, oder sonstige Status und Statistik anfragen.
Print "[DIS] >" & V_TSNEID & "<"
End Sub
'##############################################################################################################
' Empfänger für das Connect Signal (Verbindung besteht)
Sub TSNE_Connected(ByVal V_TSNEID as UInteger)
' Ab diesem Zeitpunkt ist die Verbindugn vollständig etabliert.
' Jetzt können dieverse Operationen durchgeführt werden, was das Senden von Daten,
' Statistikabfragem, oder sonstige Operationen einschliesst.
Print "[CON] >" & V_TSNEID & "<"
End Sub
'##############################################################################################################
' Empfänger für das NewConnection Signal (Neue Verbindung)
Sub TSNE_NewConnection(ByVal V_TSNEID as UInteger, ByVal V_RequestID as Socket, ByVal V_IPA as String)
' Hier empfängt unsere Server-Verbindung eine neue Verbindungsanfrage.
' Dabei werden uns die RequestID (Eindeutige Anfragenummer) sowie die IP-Adresse des Computers
' übermittelt, der eine Verbindugn mit uns wünscht.
' Wurde die IP-Adresse dieses Computers auf die BlackList gesetzt, wieder dieses Event NICHT gefeuert!
' Statdessen wird das 'NewConnectionCanceled' Event aufgerufen!
' In diesem Event MUSS ein Accept aufgerufen werden. Nur dies nimmt die RequestNummer aus dem Buffer.
' (Der Accept-Zwang wird allerdings in der nächsten Version geändert. so das mit einer ByRef Variable
' der Aufrufzwang herausgenommen werden kann)
' Nach dem Accept Aufruf kann sofort ein Disconnect erfolgen, falls gewünscht.
' Nach dem Accept ist die neue Verbindugn noch NICHT aktiv! Es muss hier auf das Connect event gewartet werden!
' Der sinn hinter diesem Event ist zur zeit einzig und allein die Kontrolle über die Akzeptierung bzw
' das Bannverhalten von IP-Adressen. Desweiteren Besteht die möglichkeit unterschiedlichen Verbindungen
' unterschiedliche CallBack-Routinen zu übergeben. So kann jede Verbindugn eine eigene Callback-Sub
' zugewissen werden. Dies geschied bei der übergabe der Callbacks an die Accept Funktion.
' Hinzu kommt, das die Accept-Routine die neue Verbindungsnummer zurück liefert. Mit dieser kann
' anschliessend im Server-Programm (also in diesem Programm hier) die neue Verbindugn vorbereitet werden,
' bevor sie vollständig etabliert wurde. Das hat den Vorteil, das sofort nach dem vollständigem
' Verbindugnsaufbau der Datentransfer einsetzen kann, ohne das zusätzlich Kontrollmechanissmen
' durchgeführt werden müssen, um zu prüffen, ob die Verbindugn überhaupt schon besteht oder nicht.
Dim XNewTSNEID as UInteger
Dim XReturnIPA as String
' Die Verbindugns-ID des Servers, die RequestID sowie die IP-Adresse der neuen Verbindung, ausgeben
Print "[NCO] >" & V_TSNEID & "<___>" & V_RequestID & "<___>" & V_IPA & "<"
' Neue Verbindungsanfrage akzeptieren, Verbindungs-ID und IP-Adresse hohlen, CallBack-Routinen übergeben
TSNE_Create_Accept(V_RequestID, XNewTSNEID, XReturnIPA, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData)
' Noch einmal die IP-Adresse der neuen Verbindung ausgeben
Print "[NIP] >" & XReturnIPA & "<"
If G_UseBlackList = 1 Then
' Jetzt fügen wir die IP zur BlackList hinzu. Beimnächsten Verbindugnswunsch wird diese IPA automatisch
' Blockiert, und das NewConnectionCanceled anstat NewConnection gefeuert.
Print "[ADD] >" & XReturnIPA & "<"
Print "[ADD]:" & TSNE_BlackList_Add(V_TSNEID, XReturnIPA)
End If
End Sub
'##############################################################################################################
' Empfänger für neue Daten
Sub TSNE_NewData(ByVal V_TSNEID as UInteger, ByRef V_Data as String)
' Diese Routine empfängt neue Daten. Sie werden im Modul automatisch aus dem Buffer geladen
' und über eine Variable (V_Data) übergeben. Anschliessend kann man die Daten z.B. in ein Array
' schreiben, das der Verbindung zugeordnet wurde.
'
' In diesem Beispiel demonstrieren wir eine HTTP Anfrage (Webbrowser) und wie man darauf reagieren kann.
Print "[NDA] >" & V_TSNEID & "<___>" & V_Data & "<"
'Prüfen ob in Anfrage ein doppelter Zeilenumbruch vorhanden ist?
Dim CRLF as String
CRLF = Chr(13) & Chr(10)
If InStr(1, V_Data, CRLF & CRLF) > 0 Then
' Zeilenumbruch wurde gefunden, HTTP Header erfolgreich empfangen
' Zu sendende Daten vorbereiten
Dim D as String
D = "<html><head><title>blub</title></head><body>TSNE-Test-Server: OK [" & Str(V_TSNEID) & "]</body></html>"
' Antwort: HTTP Header und Daten senden
TSNE_Data_Send(V_TSNEID, "HTTP/1.1 200 OK" & CRLF & "connection: close" & CRLF & CRLF & D)
' Verbindung beenden
TSNE_Disconnect(V_TSNEID)
End If
End Sub
'##############################################################################################################
' Empfänger für Abgebrochenen Verbindungsaufbau (Ausgelöst durch BlackList)
Sub TSNE_NewConnectionCanceled(ByVal V_TSNEID as UInteger, ByVal V_IPA as String)
' IP-Adressen, welche ind er BlackList stehen, werden nicht mit NewConnection
' gecallt, sondern mit dieser Funktion, wenn angegeben. Dies dient z.B. der
' Kontrole eingehender Verbindugnswünsche, oder dem Loggen von ALLEN
' Verbindungsanfragen, sofern die Blackliste eingesetzt wird, udn aktiv ist.
Print "[BLK] >" & V_TSNEID & "<___>" & V_IPA & "<"
End Sub