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

Clientversuch mit TSNE

Uploader:MitgliedMuttonhead
Datum/Zeit:16.07.2010 21:37:53

'soll ein einfaches Objekt sein, das einen Server/Clienten erzeugt, sodaß diese miteinander
'Daten austauschen können. *hust*
'(der Server ist hier noch nicht mit bei)
'Gut, die Umsetzung ist mehr als fragwürdig...
'Irgendwie gehen mir Callbacks,Netzwerk,Threads und deren Mutexen doch mächtig ab *lach*


#include once "TSNE_V3.bi"



'ist wohl für Linux notwendig, hab ich irgendwo auf der Projektseite für TSNE gelesen
'bzw in MODs Battleship war dies hier auch zu sehen
#If Defined(__FB_LINUX__)
    Const TRUE = 1
    Const FALSE =  0
#EndIf


'**************************************************************************************************
'die Entrys werden nach dem Lesen wieder gelöscht, bzw sollten via .ClearData vom Lesenden gelöscht werden!
type TSNE_CallBack_Information
    IDremote        as uinteger
    DATAreceived    as string

    declare sub ClearData
end type

sub TSNE_CallBack_Information.ClearData
    IDremote=0
    DATAreceived=""
end sub

dim shared as TSNE_CallBack_Information CallBackInfo '<-------Erzeugen des globalen Info UDT für die CallBacks
'**************************************************************************************************



'**************************************************************************************************
type TSNE_Connector
    public:
        'contype            as integer  'Typ 1=Client 2=Server,
        IDhome              as uinteger 'TSNE ID dieses Objektes hier

        established     as integer  'noch keine Verwendung '"Flag" ob der "HomeConnector" erfolgreich erzeugt wurde (wichtig nur bei Servern ?)
        connected           as integer  '"Flag" ob eine Verbindung besteht

        IDremote            as uinteger 'TSNE ID der Gegenstelle. aus CallBackInfo via GetIDremote gepullt

      DATAreceived  as string       'empfangende Daten von der Gegenstelle. aus CallBackInfo via GetDATAreceived gepullt

        errortext           as string       'Fehlermeldungen aus TSNE
        'links zu den CallBacks
        CBdisconnected                  as any ptr
        CBconnected                         as any ptr
        CBnewdata                               as any ptr
        CBnewconnection                 as any ptr
        CBnewconnectioncanceled as any ptr

        declare constructor()
        declare sub LinkCallBacks (dc as any ptr, c as any ptr, nd as any ptr, nc as any ptr, ncc as any ptr)
        declare function CreateClient (ip as string) as integer
        declare function SendData(d as string) as integer
        declare function CheckConnection as integer
    declare sub BreakConnection

        declare function GetIDremote(t as single=60) as integer
        declare function GetDATAreceived(t as single=60) as integer
end type



constructor TSNE_Connector()
    CBdisconnected                  =0
    CBconnected                         =0
    CBnewdata                               =0
    CBnewconnection                 =0
    CBnewconnectioncanceled =0
end constructor



sub TSNE_Connector.LinkCallBacks (dc as any ptr, c as any ptr, nd as any ptr, nc as any ptr, ncc as any ptr)
    CBdisconnected                  =dc
    CBconnected                         =c
    CBnewdata                               =nd
    CBnewconnection                 =nc
    CBnewconnectioncanceled =ncc
end sub


function TSNE_Connector.SendData(d as string) as integer
    dim as integer tsne_success
    tsne_success=TSNE_Data_Send(IDremote,d)
    if tsne_success=TSNE_Const_NoError then
        function=1
    else
        errortext=TSNE_GetGURUCode(tsne_success)
        function=0
    end if
end function


function TSNE_Connector.CreateClient (ip as string) as integer
    dim as integer tsne_success
    tsne_success=TSNE_Create_Client(IDhome, ip, 80, CBdisconnected, CBconnected, CBnewdata, 60)
    if tsne_success=TSNE_Const_NoError and GetIDremote()=1 then
        established=1
        function=1
    else
        errortext=TSNE_GetGURUCode(tsne_success)
        function=0
    end if
end function



function TSNE_Connector.CheckConnection as integer
  if TSNE_IsClosed(IDhome)=1 then function=0 else function=1
end function



sub TSNE_Connector.BreakConnection
    TSNE_Disconnect (IDhome)
end sub



'bei erfolgreicher Informationsbeschaffung liefert diese Funktion eine 1
function TSNE_Connector.GetIDremote(t as single=60) as integer
    dim as single tt=timer
    dim as integer pulled=0
    'Schleife um die entsprechende Information aus CallBackInfo heraus zu pullen
    'da die Callbacks von TSNE asynchron aufgerufen werden, gibt es diesen
    'Loop mit Zeitbegrenzung
    do
        if CallBackInfo.IDremote>0 then
      IDremote=CallBackInfo.IDremote
      CallBackInfo.ClearData
            pulled=1
        end if
        sleep 1
    loop until (timer>=tt+t) or (pulled=1)
    function=pulled
end function



'bei erfolgreicher Informationsbeschaffung liefert diese Funktion eine 1
function TSNE_Connector.GetDATAreceived(t as single=60) as integer
    dim as single tt=timer
    dim as integer pulled=0
    'Schleife um die entsprechende Information aus CallBackInfo heraus zu pullen
    'da die Callbacks von TSNE asynchron aufgerufen werden, gibt es diesen
    'Loop mit Zeitbegrenzung
    do
        if CallBackInfo.DATAreceived<>"" then
      DATAreceived=CallBackInfo.DATAreceived
      CallBackInfo.ClearData
            pulled=1
        end if
        sleep 1
    loop until (timer>=tt+t) or (pulled=1)
    function=pulled
end function
'**************************************************************************************************



'**************************************************************************************************
'die Callbacks können/sollen Daten in den globalen CallBackInfo schreiben
sub ClientDisConnected (id as uinteger)
    print "unterbrochen"
end sub



sub ClientConnected (id as uinteger)
    CallBackInfo.IDremote=id
    print "verbunden"
end sub



sub ClientNewData (id as uinteger, dat as string)
    CallBackInfo.IDremote=id
  CallBackInfo.DATAreceived=dat
end sub
'**************************************************************************************************


'Programmstart*****************************************************************

sub menu
    print
    print "g-> Google-Startseite holen"
    print "q-> Verbindung trennen"
    print
end sub

dim as TSNE_Connector Client                                                                        '"Connector-Objekt" erstellen
Client.LinkCallBacks (@ClientDisConnected,@ClientConnected,@ClientNewData,0,0)'CallBacks einbinden

dim as string key,msgout,crlf
crlf= chr(13, 10)

msgout += "GET / HTTP/1.1" & crlf
msgout += "HOST: www.google.de" & crlf
msgout += "connection: hold" & crlf
msgout += crlf

if Client.CreateClient ("www.google.de") then 'wenn ein Socket erzeugt und eine Verbindung besteht dann...
    menu                                        'zeige Menü

    do while Client.CheckConnection             'überprüfe Verbindung und solang eine besteht
    key=inkey

    if Client.GetDATAreceived(0) then         'überprüfe ob der NewData-CallBack im CallBackInfo-UDT irgendwelche Daten
                                                                                            'hinterlassen hat, wenn ja diese ins Connector-Objekt retten und aus dem
                                                                                            'CallBackInfo-UDT löschen
            print "empfangende Daten:"
            print Client.DATAreceived               'Data anzeigen
            menu                                    'zeige Menü
        end if

        if key="q" then                           'bei q Verbindung unterbrechen, was den Loop verlässt
            Client.BreakConnection
        end if

        if key="g" then                           'bei g Google-Startseite anfordern
            Client.SendData(msgout)
        end if
        sleep 1
    loop
end if
TSNE_WaitClose(Client.IDhome)

print:print"Taste druecken"
sleep
end