Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

TSNE + TSNE PLAY
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 05.01.2013, 10:30    Titel: TSNE + TSNE PLAY Antworten mit Zitat

Hi
Ich habe mich jetzt ein paar Tage durch die TSNE sache durchgelesen und hätte da noch ein paar Fragen.

hab Server und
Client geladen zum fumeln und lernen

1. wie weiß die server.bas das z.B. ein Client eine Msg. gesendet hat - denn das Programm ist ja lediglich eine endlosschleife in der nichts steht
Code:
' Das "Programm"
do
  sleep 1
loop until inkey = chr(27)


2. ist es möglich 2 verschiedene programme gleichzeitig mit tsne laufen zu lassen - z.b. ein mail-prog und ein game, wenn ja wie würde das umgesetzt... ich denke das z.b. der game client bei der serveranfrage sein programmnamen mitsenden müsste oder so.

ich denk das reicht erstmal

EDIT: 2. hat sich erledigt... das wird über die Ports gesteuert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Domso



Anmeldungsdatum: 02.02.2011
Beiträge: 109

BeitragVerfasst am: 05.01.2013, 16:42    Titel: Antworten mit Zitat

das mit der endlosschleife regelt tsne von alleine

wenn jetzt zb der client eine nachricht an den server schickt, wird automatisch
Code:

TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
                     byval typ as TSNEPlay_MessageType_Enum)
  ' Ein Spieler hat uns / allen eine Nachricht geschickt
  print "Nachricht von " & von & ": " & nachricht
end sub

ausgeführt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 05.01.2013, 17:14    Titel: Antworten mit Zitat

Wie ist das möglich? Der erklärt nicht, dass die Hauptschleife praktisch leer ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 05.01.2013, 17:17    Titel: Antworten mit Zitat

Das ist sehr einfach möglich. Dafür braucht man nur Threads und Callback-Funktionen. GUI-Eventsysteme sind genauso aufgebaut.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 05.01.2013, 18:55    Titel: Antworten mit Zitat

ah ok danke

jetzt wollt ich den clienten so abändern das wenn er keine verbindungsnachricht bekommt, er selbst ein server startet und erneut versucht zu verbinden.

wäre es so richtig?

Code:
sub TSNEPlay_Player_Connected(byval id as uinteger, IPA as string, nick as string)
  ' Spieler wurde verbunden
  DIM SHARED AS STRING verbindung
  print id & " hat die Verbindung hergestellt"
  verbindung = "OK"
end sub


Code:

' Aufbau der Verbindung
randomize timer
dim as integer zufallsnummer = rnd*99999
DO
netzwerk = TSNEPlay_ConnectToServer(ServerAdresse, ServerPort, "Client" & zufallsnummer, "geheimesPasswort", _
           @TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, _
           @TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
Sleep 2000, 1
IF verbindung = "OK" THEN EXIT DO
RUN Server.exe
LOOP
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.01.2013, 01:25    Titel: Antworten mit Zitat

Eigentlich kannst du das ganz simpel, anders lösen.

Du fürst den aufbau einr verbindung mithilfe der funktion
Code:
TSNEPlay_ConnectToServer(...)

aus.

diese liefert dir einen "Return-code" zurück. Dieser enthält anschliessend den status des Funktionsaufrufs.

Code:
Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(...)
Print TSNEPlay_Desc_GetGuruCode(RV)


Wenn hier kein fehler aufgetreten ist, kannst du simpel prüfen, ob die verbindung erfolgreich hergestellt wurde, indem du den Status der Verbindugn mithilfe von
Code:
TSNEPlay_Connection_GetState()

abfragst

Code:
Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(...)
If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): End -1
Dim TState as TSNEPlay_State_Enum
Dim TStateL as TSNEPlay_State_Enum
Dim XTot as Double = Timer() + 60
Do Until InKey() = Chr(27)
    'Den Aktuellen Verbindungsstatus abfragen
    TState = TSNEPlay_Connection_GetState()
    If TStateL <> TState Then
        TStateL = TState
        Select Case TState
            Case TSNEPlay_State_Disconnected, TSNEPlay_State_Ready: Exit Do
        End Select
        'Hiermit könnten wir den AKtuellen Status in Klartext umsetzen lassen
        Print TSNEPlay_Desc_GetStateCode(TState)
    End If
    Sleep 1, 1
    'Timeout?, dan raus hier.
    If XTot < Timer() Then Exit Do
Loop
'Und nochmal prüfen (falls es ein timeout gab)
TState = TSNEPlay_Connection_GetState()
If TState <> TSNEPlay_State_Ready Then
    Print "Verbindung zum Server fehlgeschlagen!"
    End -1
End If


Wie aus dem Beispiel von TSNEPlay.

Hier könntest du simpel prüfen, ob ein timeout eintrat, oder ein anderer fehler.
Code:

Dim TConnected as Integer = 0
'verbindung herstellen
Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(...)
If RV = TSNEPlay_NoError Then
    Dim XTot as Double = Timer() + 60
    Do Until InKey() = Chr(27)
        Select Case TSNEPlay_Connection_GetState()
            Case TSNEPlay_State_Disconnected: Exit Do
            Case TSNEPlay_State_Ready: TConnected = 1
        End Select
        Sleep 1, 1
        If XTot < Timer() Then Exit Do
    Loop
    If TSNEPlay_Connection_GetState() = TSNEPlay_State_Ready Then TConnected = 1
End If
If TConnected = 0 Then
    Print "Konnte verbindugn nicht herstellen! Etabliere Server!"
    RV = TSNEPlay_CreateServer(10, 1234, "ServerNickname", "ServerPass", @TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
    If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): End -1
End If



So sollte das recht easy und safe vonstatten gehen.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.01.2013, 15:05    Titel: Antworten mit Zitat

ich bekomm das nicht gebacken

ich hab den code so verstanden... ist der server auf pc a nicht erreichbar dann wird der client auf pc b selbst zum server.

pc a als server erreichbar funzt aber wenn nicht dann meldung : [ERROR] NOT READY

Code:
screen 18
DIM SHARED AS STRING ServerAdresse
DIM SHARED AS STRING newmail
newmail = ""
DIM SHARED AS Ushort ServerPort
input "Serveradresse: "; ServerAdresse
input "Port: "; ServerPort
print "CLIENT - Meldung eingeben; anschliessend beenden mit ESC"
' ***** Netzwerkverbindung *****

#include once "tsneplay_v3.bi"

sub TSNEPlay_ConnectionState(byval von as uinteger, byval state as TSNEPlay_State_Enum)
  ' Rückmeldung für einen Spieler über seinen Status
end sub

sub TSNEPlay_Player_Connected(byval id as uinteger, IPA as string, nick as string)
  ' Spieler wurde verbunden
  print id & " hat die Verbindung hergestellt"
end sub

sub TSNEPlay_Player_Disconnected(byval id as uinteger)
  ' Spieler wurde getrennt
  print id & " hat die Verbindung abgebrochen"
end sub

sub TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
                     byval typ as TSNEPlay_MessageType_Enum)
  'Ein Spieler hat uns / allen eine Nachricht geschickt
  print "Nachricht von " & von & ": " & nachricht
  ? "NachrichtenTyp: " & typ
  ? "Nachricht an " & zu
  newmail = nachricht
end sub

sub TSNEPlay_Move(byval von as uinteger, byval zu as uinteger, byval typ as double, _
                  byval x as double, byval y as double, byval r as uinteger)
  ' Spielzug
end sub

sub TSNEPlay_Data(von as uinteger, zu as uinteger, daten as string)
 ' Meldung vom Programmierer
end sub

' Aufbau der Verbindung

Dim TConnected as Integer = 0
'verbindung herstellen
Dim RV as TSNEPlay_GURUCode = TSNEPlay_ConnectToServer(ServerAdresse, ServerPort, "Client", "geheimesPasswort", _
           @TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, _
           @TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)
If RV = TSNEPlay_NoError Then
    Dim XTot as Double = Timer() + 6
    Do Until InKey() = Chr(27)
        Locate 1, 40: ? "Bereit in " & XTot - TIMER()
        Select Case TSNEPlay_Connection_GetState()
            Case TSNEPlay_State_Disconnected: Exit Do
            Case TSNEPlay_State_Ready: TConnected = 1
        End Select
        Sleep 1, 1
        If XTot < Timer() Then Exit Do
    Loop
    If TSNEPlay_Connection_GetState() = TSNEPlay_State_Ready Then TConnected = 1
End If
If TConnected = 0 Then
    Print "Konnte verbindugn nicht herstellen! Etabliere Server!"
    RV = TSNEPlay_CreateServer(10, ServerPort, "Server", "geheimesPasswort", @TSNEPlay_ConnectionState, _
           @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, _
           @TSNEPlay_Data)
    If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): sleep:End -1
End If
' Daten an den Server schicken
dim as string eingabe
do
  sleep 1
  eingabe = inkey
  IF newmail <> "" THEN locate 1, 40: ? "1 neue Mail!"
  if eingabe <> "" then TSNEPlay_SendMSG(0, "" & eingabe)
loop until eingabe = chr(27)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.01.2013, 15:20    Titel: Antworten mit Zitat

Hi.

Das liegt an einem Kleinen Bug in TSNEplay ...

als Abhilfe kannst du entweder die [TSNEplay_V3.bi erneut herunterladen, oder du machst vor dem create server ein "TSNEPlay_CloseAll()".

Beim Aufruf der connect oder server function wird, bei fehlerhaftem verbindungsaufbau der "verbindungsstatus" nicht zurück gesetzt. das führt dazu, das ein erneuter aufruf mit der meldung "[ERROR] Not Ready! Conection Already Exist! Close all connections!" Abbricht. Denn, 2 Verbindungen über TSNEplay sind gleichzeitig nicht möglich (und war auch nie vorgesehen (Ist ja nur ein kleines help-schnipsel)).


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.01.2013, 15:35    Titel: Antworten mit Zitat

super danke.

Habs neu geladen. Der Error kommt nun nicht mehr nur das er den Server etabliert. Doch leider meine Eingaben nicht angezeigt... kann es sein das die SUBs neu geladen werden müssen bzw TSNE neu mitgeteilt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.01.2013, 15:52    Titel: Antworten mit Zitat

Nun .. das liegt daran, weil auf vielfachen wunsch der community ich ein Flag in die TSNEPlay_CreateServer Funktion eingebaut habe, das verhindert, das ein localer client erzeugt wird.

Um dem Server auch einen localen Clienten hinzuzufügen, musst du am ende der Funktion noch ein ",0" hinzufügen.

Code:

RV = TSNEPlay_CreateServer(10, ServerPort, "Server", "geheimesPasswort", @TSNEPlay_ConnectionState, _
           @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, _
           @TSNEPlay_Data, 0)


Hiermit weist du der funktion zu, das "nicht hinzufügen" zu ignorieren, und einen lokalen clienten zu erzeugen.

Dann sollte es funktionieren.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.01.2013, 18:09    Titel: Antworten mit Zitat

ja danke so geht es.

nochmal eine kleine zwischen frage.

wenn das programm mit END -1 beendet wird ist das wie eine info ans betriebssystem das ein fehler aufgetreten ist und es die Variablen aus dem arbeitsspeicher löschen soll/muss ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.01.2013, 18:12    Titel: Antworten mit Zitat

Das Betriebssystem >sollte generell< beim beenden eines Programmes (egal welcher returncode (end ...)) den speicher welcher zu diesem programm gehört, und von diesem eingeholt wurde, wieder leeren.

Windows hat da aber manchmal so seine macken, und macht dies nicht anständig.
Bei Linux ist mir das zwar auch schon untergekommen, allerdings in extrem seltenen fällen.

GENERELL sollte der Programmierer dafür sorgen, das vor dem Ende des Programmes auch der von Ihm erzeugte Speicher wieder freigegeben wird.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.01.2013, 18:51    Titel: Antworten mit Zitat

oha ok... bis jetzt hab ich immer alles was ich gemacht habe nur mit End beendet. gut zu wissen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.01.2013, 19:00    Titel: Antworten mit Zitat

Noch als anmerkung. Das gilt bei Freebasic NUR für die "Allocate" oder "CAllocate" Funktionen.

Alles andere wie "Dim bla...." usw. wird von Freebasic selbst wieder aufgeräumt.

Nur speicher der mit Allocate oder C... erzeugt wurde, wird von freebsic nicht mehr aufgeräumt.

Du brauchst also Dim's nicht "aufräumen" (was auch nicht funktioniert)


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.01.2013, 19:08    Titel: Antworten mit Zitat

achso ok
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 11.01.2013, 16:36    Titel: Antworten mit Zitat

gibt TSNE eigentlich ne Meldung zurück wenn der PC momentan keine I-net Verbindung hat? wenn ja wie kann ich diese Meldung abfangen.

Und dann wollt ich nochmal fragen, ich hatte vor ein paar Tagen einen Thread gelesen in dem es um externe Verbindungen ging.
Also im Heimnetz ist alles super PC Name eingeben und Verbindung steht. Und wenn ich mich mit einem Freund verbinden möchte, muss ich ich lediglich seine Externe IP kennen und eingeben?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 11.01.2013, 16:42    Titel: Antworten mit Zitat

Nein. TSNE kann nicht erkennen, ob eine I-Net verbindung besteht.

Du könntest das allerdings in kombination mit der erkennung der WAN-IP-Adresse kombinieren.

Da du / dein gegner die WAN-IP-Adresse benötigt, um über das Internet eine Verbindung herstellen zu können, kannst du folgenden Source nutzen, um die WAN-IP Adresse zu ermitteln.

Wenn diese ermittelt wurde, ist damit auch sichergestellt, das du derzeit, bzw. zum zeitpunkt der abfrage der WAN-IP, auch eine Inet verbindung besteht / bestand.

http://www.freebasic-portal.de/porticula/testgetwanipa-bas-1229.html

Alternativ kannst du die Erweiterung von TSNE (TSNEX) einbinden und die Funktion TSNEX_GetWANIPA() aufrufen. Diese ermittelt dir ohne das ganze geschnörkerl ausenrum die WAN IP-Adresse. Allerdings erhöht sie auch den source und damit die binäri gröse. (was bei einer solch kleinen funktion eigentlich etwas too much is)


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 11.01.2013, 19:59    Titel: Antworten mit Zitat

Danke für die schnelle Antwort... doch leider muss ich mich dem später widmen. Es hat sich ein Problem aufgetan.

Auf PC 2 läuft der Server und PC 1verbindet sich. Programm auf PC 1 läuft und zeigt auch die eigenen Eingaben an. Gebe ich jetzt wahllos mehrere Buchstaben ein reagiert das Programm nach ca 10 - 20 Eingaben nicht mehr.

Programm
Code:


'DIMs für TSNE
DIM SHARED AS STRING ServerAdresse
DIM SHARED AS INTEGER iVerbindung
'Function
DIM SHARED AS STRING TxtArray (10)
DIM SHARED AS INTEGER MaxTxtLen
'Programm
DIM SHARED AS INTEGER i, ze, Auswahl
DIM SHARED AS STRING newmail
DIM SHARED AS STRING Eingabe, Txt, Txt2
DIM SHARED AS INTEGER w, h, depth, wh

newmail = "": Txt = ""
DIM SHARED AS STRING *15 PMPartner
DECLARE FUNCTION TxtF (Txt AS STRING, MaxTxtLen as Integer, Txt2 AS STRING) AS STRING
                      '[Txt = Rückgabe][MaxTxtLen = Länge der Eingabe][Txt2 = Text an den angeschlossen wird]
 
#include ONCE "vbcompat.bi"
#include ONCE "autowrite.bi"
#include ONCE "vbcompat.bi"
#INCLUDE ONCE "fbgfx.bi"
#Include Once "windows.bi"

ScreenControl FB.GET_DESKTOP_SIZE, w, h 'Desktopauflösung auslesen

SCREENRES w -1 , h - 1, 32,, FB.GFX_SHAPED_WINDOW or FB.GFX_ALWAYS_ON_TOP
Color ,&hFF00FF: CLS

'###################### anlegen einer PC Liste #################################
Close
IF NOT FileExists ("PcListe.dat") THEN
  autowrite (&haaAAaa, 10, 25, "Verbindung eintragen (Pc Name)")
  Auswahl = 1
  Do
    Sleep 1
    Eingabe = InKey
   
    SELECT CASE RIGHT(Eingabe, 1)
    CASE CHR(77)                     'rechts
      Auswahl += 1
      IF Auswahl > 10 THEN Auswahl = 1
      Eingabe = ""
     
    CASE CHR(75)                     'links
      Auswahl -= 1
      IF Auswahl < 1 THEN Auswahl = 10
      Eingabe = ""

    END SELECT

    IF Eingabe <> "" THEN TxtArray(Auswahl) = TxtF(Txt, 15, TxtArray(Auswahl)) 'Function Txt += Eingabe
           
    ze = 45
    ScreenLock
    FOR i = 1 TO 10
      Line (8, ze - 2) - STEP(120, 10),&hFFFFFF ,BF: autowrite (&h000000, 10, ze, STR(i) & ". " + TxtArray(i))
      IF Auswahl = i THEN Line (8, ze - 2) - STEP(120, 10),&hAAcccc ,b
      ze += 20
    NEXT i
    ScreenUnLock
  Loop until Eingabe = chr(13)
 
  IF Txt <> "" THEN
    OPEN EXEPATH + "\PcListe.dat" FOR RANDOM AS #1 LEN=LEN(PMPartner)
    For i = 1 TO 10
      PMPartner = TxtArray(i): PUT #1, i, PMPartner
    Next i
    Close
  ELSE
    END
  END IF 'Txt <> ""
END IF 'NOT FileExists ("PcListe.dat")

'######################### Optionen u. Verbindungen laden ######################

OPEN EXEPATH + "\PcListe.dat" FOR RANDOM AS #1 LEN=LEN(PMPartner)
For i = 1 TO 10
  GET #1, i, PMPartner
  TxtArray(i) = PMPartner
Next i

     

' ***** Netzwerkverbindung *****
CLS
#include once "tsneplay_v3.bi"
dim shared RV as TSNEPlay_GURUCode

sub TSNEPlay_ConnectionState(byval von as uinteger, byval state as TSNEPlay_State_Enum)
  ' Rückmeldung für einen Spieler über seinen Status
end sub

sub TSNEPlay_Player_Connected(byval id as uinteger, IPA as string, nick as string)
  ' Spieler wurde verbunden
  print id & " hat die Verbindung hergestellt"
end sub

sub TSNEPlay_Player_Disconnected(byval id as uinteger)
  ' Spieler wurde getrennt
  print id & " hat die Verbindung abgebrochen"
end sub

sub TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
                     byval typ as TSNEPlay_MessageType_Enum)
  'Ein Spieler hat uns / allen eine Nachricht geschickt
  print "Nachricht von " & von & ": " & nachricht
  ? "NachrichtenTyp: " & typ
  ? "Nachricht an " & zu
  newmail = nachricht
end sub

sub TSNEPlay_Move(byval von as uinteger, byval zu as uinteger, byval typ as double, _
                  byval x as double, byval y as double, byval r as uinteger)
  ' Spielzug
end sub

sub TSNEPlay_Data(von as uinteger, zu as uinteger, daten as string)
 ' Meldung vom Programmierer
end sub

' Aufbau der Verbindung

Dim TConnected as Integer = 0
'verbindung herstellen
FOR iVerbindung = 1 TO 10
  IF LEN(TxtArray(iVerbindung)) > 0 THEN
    ServerAdresse = TxtArray(iVerbindung)
    ? "Verbinde mit " & ServerAdresse
    RV = TSNEPlay_ConnectToServer(ServerAdresse, 1234, "Client", "geheimesPasswort", _
      @TSNEPlay_ConnectionState, @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, _
      @TSNEPlay_Message, @TSNEPlay_Move, @TSNEPlay_Data)       ' Port ist UShort
    If RV = TSNEPlay_NoError Then
      Dim XTot as Double = Timer() + 6
      Do Until InKey() = Chr(27)
        Locate 1, 40: ? "Bereit in " & XTot - TIMER()
        Select Case TSNEPlay_Connection_GetState()
          Case TSNEPlay_State_Disconnected: Exit Do
          Case TSNEPlay_State_Ready: TConnected = 1
        End Select
        Sleep 1, 1
        If XTot < Timer() Then Exit Do
      Loop
      If TSNEPlay_Connection_GetState() = TSNEPlay_State_Ready Then TConnected = 1:EXIT FOR
    End If
  END IF 'LEN(TxtArray(iVerbindung) > 0
NEXT iVerbindung 
If TConnected = 0 Then
    Print "Konnte verbindung nicht herstellen! Etabliere Server!"
    RV = TSNEPlay_CreateServer(10, 1234, "Server", "geheimesPasswort", @TSNEPlay_ConnectionState, _
           @TSNEPlay_Player_Connected, @TSNEPlay_Player_Disconnected, @TSNEPlay_Message, @TSNEPlay_Move, _
           @TSNEPlay_Data, 0) ',0 weist der funktion zu, das "nicht hinzufügen eines lokalen clienten" zu ignorieren
    If RV <> TSNEPlay_NoError Then Print "[ERROR] "; TSNEPlay_Desc_GetGuruCode(RV): sleep:End -1
End If

' Daten an den Server schicken
' z.B. TSNEPlay_SendMSG(0, "" & eingabe)

' ******************************* Programm Start *******************************

do
  sleep 1
  ScreenLock
  LINE (w / 2 - 30, 1) - STEP (60, 9),&hABCD45,BF           '&hABCD45
  autowrite (&h00FF00,  w / 2 - (4 * 6) + 1, 3,"postmail")   '&h00FF00
  ScreenUnLock

  eingabe = inkey
  IF newmail <> "" THEN locate 10, 3: ? "1 neue Mail!"
  if eingabe <> "" then TSNEPlay_SendMSG(0, "" & eingabe)
loop until eingabe = chr(27)

'############################ Funktionen #######################################

FUNCTION TxtF (Txt AS STRING, MaxTxtLen AS Integer, Txt2 AS STRING) AS STRING
 
  IF LEN(Eingabe) = 1 THEN
    SELECT CASE ASC(Eingabe)
    CASE IS = 8                       'backspace
      IF LEN(Txt2) = 0 THEN EXIT SELECT
      Txt = MID(Txt2, 1, LEN(Txt2) - 1)
     
    CASE IS = 13                      'enter
     
    CASE IS = 27                      'ESC
     
    CASE 48 TO 57                     'zahlen 0-9
      IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
      Txt = Txt2 + Eingabe
     
    CASE 65 TO 90                     'A-Z
      IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
      Txt = Txt2 + Eingabe
               
    CASE 97 TO 122                    'a-z
      IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
      Txt = Txt2 + Eingabe
               
    CASE ELSE                         'sonderzeichen (.,-/....)
      IF LEN(Txt2) = MaxTxtLen THEN EXIT SELECT
      IF ASC(Eingabe) = 129 THEN Eingabe = "ü"
      IF ASC(Eingabe) = 154 THEN Eingabe = "Ü"
      IF ASC(Eingabe) = 132 THEN Eingabe = "ä"
      IF ASC(Eingabe) = 142 THEN Eingabe = "Ä"
      IF ASC(Eingabe) = 148 THEN Eingabe = "ö"
      IF ASC(Eingabe) = 153 THEN Eingabe = "Ö"
      IF ASC(Eingabe) = 225 THEN Eingabe = "ß"
      IF Eingabe = "," THEN Eingabe = "."
      Txt = Txt2 + Eingabe
               
    END SELECT
  END IF 'LEN(keytxt)
  Return Txt
END Function


autowrite.bi
Code:

'version 20130107
'aufruf mit -> autowrite (,,,)
'                        [farbe &h000000][spalte 150][zeile 200][text "..."]
'Diese Routine beherscht nur die großschreibung - kleine Eingaben werden nur groß dargestellt


DECLARE SUB autowrite (c AS INTEGER,sp AS INTEGER,ze AS INTEGER,wort AS STRING)

SUB autowrite (c AS INTEGER,sp AS INTEGER,ze AS INTEGER,wort AS STRING)
    DIM AS INTEGER i
    DIM AS STRING bust
    COLOR c
    FOR i = 1 TO LEN(wort)
       
        SELECT CASE wort[i-1]
        CASE 65, 97'a
            PSET (sp, ze + 4): DRAW "u3 e1 r2 d4 u2 l3"
        CASE 132, 142, 196, 228' Ä-> '-'-> 196  ä-> õ-> 228
            PSET (sp, ze + 4): DRAW "u2 e2 f2 d2 u2 l4 bu3 u-1 br4 d-1": sp = sp + 1
        CASE 66, 98'b
            PSET (sp, ze): DRAW "d4 r2 e1 h1 l1 r1 e1 h1 l2"
        CASE 67, 99'c
            PSET (sp + 3, ze): DRAW "l2 g1 d2 f1 r2"
        CASE 68, 100'd
            PSET (sp, ze): DRAW "d4 r2 e1 u2 h1 l2"
        CASE 69, 101'e
            PSET (sp + 3, ze): DRAW "l3 d2 r2 l2 d2 r3"
        CASE 70, 102'f
            PSET (sp + 3, ze): DRAW "l3 d2 r2 l2 d2"
        CASE 71, 103'g
            PSET (sp + 3, ze): DRAW "l2 g1 d2 f1 r2 u2 l1"
        CASE 72, 104'h
            PSET (sp, ze): DRAW "d4 u2 r3 u2 d4"
        CASE 73, 105'i
            PSET (sp + 2, ze): DRAW "d4"
        CASE 74, 106'j
            PSET (sp, ze): DRAW "r3 d3 g1 l1 h1"
        CASE 75, 107'k
            PSET (sp, ze): DRAW "d4 u2 r1 e2 g2 f2"
        CASE 76, 108'l
            PSET (sp, ze): DRAW "d4 r3"
        CASE 77, 109'm
            PSET (sp, ze + 4): DRAW "u4 f2 e2 d4"
        CASE 78, 110'n
            PSET (sp, ze + 4): DRAW "u4 f4 u4"
        CASE 79, 111'o
            PSET (sp, ze + 1): DRAW "d2 f1 r1 e1 u2 h1 l1"
        CASE 148, 153, 214, 246 'Ö-> í-> 214  ö-> ÷-> 246
            PSET (sp, ze + 2): DRAW "d1 f1 r1 e1 u1 h1 l1 bl1 bu2 d-1 br3 l-1"
        CASE 80, 112'p
            PSET (sp, ze + 4): DRAW "u4 r2 f1 g1 l1"
        CASE 81, 113'q
            PSET (sp, ze + 1): DRAW "d2 f1 r1 e1 f1 h1 u2 h1 l1": sp = sp + 1
        CASE 82, 114'r
            PSET (sp, ze + 4): DRAW "u4 r2 f1 g1 l1 f2"
        CASE 83, 115's
            PSET (sp, ze + 4): DRAW "r2 e1 h1 l1 h1 e1 r2"
        CASE 84, 116't
            PSET (sp, ze): DRAW "r2 d4 u4 r2"
        CASE 85, 117'u
            PSET (sp, ze): DRAW "d4 r3 u4"
        CASE 129, 154, 220, 252'Ü-> _-> 220  ü-> ³-> 252
            PSET (sp, ze - 1): DRAW "bd2 d3 r3 u3 bu2 r-1"
        CASE 86, 118'v
            PSET (sp, ze): DRAW "d2 f2 e2 u2": sp = sp + 1
        CASE 87, 119'w
            PSET (sp, ze): DRAW "d4 e2 f2 u4"
        CASE 88, 120'x
            PSET (sp, ze): DRAW "f4 h2 g2 e4"
        CASE 89, 121'y
            PSET (sp, ze): DRAW "d2 r3 u2 d4 l2"
        CASE 90, 122'z
            PSET (sp, ze + 1): DRAW "u1 r3 g3 d1 r3 u1"
        CASE 49'1
            PSET (sp + 2, ze + 4): DRAW "u4 g2"
        CASE 50'2
            PSET (sp, ze + 1): DRAW "e1 r1 f1 g3 r3"
        CASE 51'3
            PSET (sp, ze + 4): DRAW "r2 e1 h1 l1 r1 e1 h1 l2"
        CASE 52'4
            PSET (sp + 2, ze + 4): DRAW "u4 g2 d1 r3"
        CASE 53'5
            PSET (sp, ze + 4): DRAW "r2 e1 h1 l2 u2 r3"
        CASE 54'6
            PSET (sp + 2, ze): DRAW "l1 g1 d2 f1 r1 e1 h1 l1"
        CASE 55'7
            PSET (sp, ze + 1): DRAW "u1 r3 d1 g3"
        CASE 56'8
            PSET (sp, ze + 1): DRAW "f1 g1 f1 r1 e1 h1 e1 h1 l1"
        CASE 57'9
            PSET (sp + 2, ze + 2): DRAW "l1 h1 e1 r1 f1 d2 g1 l1"
        CASE 48'0
            PSET (sp, ze + 1): DRAW "d2 f1 r2 e1 u2 h1 l2"
        CASE 225, 223'ß-> ¯-> 223
            PSET (sp, ze + 5): DRAW "u5 r1 f1 d1 l1 r1 f1 g1"
        CASE 37'%
            PSET (sp, ze): PSET (sp + 4, ze + 4): PSET (sp, ze + 4): DRAW "e4": sp = sp + 2
        CASE 62'>
            PSET (sp + 1, ze + 4): DRAW "e2 h2"
        CASE 60'<
            PSET (sp + 4, ze + 4): DRAW "h2 e2"
        CASE 47'/
            PSET (sp, ze + 4): DRAW "e4"
        CASE 92'\
            PSET (sp + 4, ze + 4): DRAW "h4"
        CASE 95'_
            PSET (sp, ze + 4): DRAW "r4"
        CASE 43'+
            PSET (sp + 1, ze + 2): DRAW "r2 l1 u1 d2"
        CASE 45'-
            PSET (sp + 1, ze + 2): DRAW "r2"
        CASE 46'.
            PSET (sp + 2, ze + 4): DRAW ""
        CASE 44',
            PSET (sp + 2, ze + 4): DRAW "g1"
        CASE 40'(
            PSET (sp + 2, ze): DRAW "g1 d3 f1"
        CASE 41')
            PSET (sp + 2, ze): DRAW "f1 d3 g1"
        CASE 63'?
            PSET (sp + 1, ze + 1): DRAW "e1 r1 f1 g1 l1 d1 bd2 d-1"
        CASE 58':
            PSET (sp + 2, ze + 4): PSET (sp + 2, ze + 2)
        CASE 32'" "
            'SPACE sp = sp + 6
        CASE ELSE
            '

        END SELECT
       
        sp = sp + 6
       
    NEXT i
END SUB

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 11.01.2013, 20:02    Titel: Antworten mit Zitat

Es ist extrem wichtig, das du eingaben / ausgaben (text / grafik) per mutex sperrst. diese funktionen sind in der derzeitigen rtlib nicht threadsafe. da tsne / play auf threads bassiert, musst du entsprechend diese grafikoperationen sichern.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 11.01.2013, 21:32    Titel: Antworten mit Zitat

ehrlich gesagt versteh ich nur die hälfte. Also um was geht ist klar. Nur die Umsetzung ist noch nicht ganz klar.

Ich versuchs mal anhand meines geposteten Code.

dieser Teil verwaltet eingehende Nachrichten und shreibt diese in die Variable newmail. Und hierbei muss ich jetzt sperren !?
Code:
sub TSNEPlay_Message(byval von as uinteger, byval zu as uinteger, byval nachricht as string, _
                     byval typ as TSNEPlay_MessageType_Enum)
  'Ein Spieler hat uns / allen eine Nachricht geschickt
  print "Nachricht von " & von & ": " & nachricht
 MutexLock
  newmail = nachricht
 MutexUnlock
end sub


Und hier soll newmail weiterverarbeitet oder ausgegeben werden
Code:
do
  sleep 1
  ScreenLock
  LINE (w / 2 - 30, 1) - STEP (60, 9),&hABCD45,BF           '&hABCD45
  autowrite (&h00FF00,  w / 2 - (4 * 6) + 1, 3,"postmail")   '&h00FF00
  ScreenUnLock

  eingabe = inkey
 MutexLock
  IF newmail <> "" THEN locate 10, 3: ? "1 neue Mail!"
 MutexUnlock
  if eingabe <> "" then TSNEPlay_SendMSG(0, "" & eingabe)
loop until eingabe = chr(27)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz