Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

server_test.bas

Uploader:MitgliedThePuppetMaster
Datum/Zeit:31.01.2008 07:51:08

'##############################################################################################################
'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
    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