fb:porticula NoPaste
Clientversuch mit TSNE
Uploader: | Muttonhead |
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