| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 05.01.2013, 09:30    Titel: TSNE + TSNE PLAY |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Domso 
 
 
 Anmeldungsdatum: 02.02.2011
 Beiträge: 109
 
 
 | 
			
				|  Verfasst am: 05.01.2013, 15:42    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Westbeam 
 
  
 Anmeldungsdatum: 22.12.2009
 Beiträge: 760
 
 
 | 
			
				|  Verfasst am: 05.01.2013, 16:14    Titel: |   |  
				| 
 |  
				| Wie ist das möglich? Der erklärt nicht, dass die Hauptschleife praktisch leer ist. |  |  
		| Nach oben |  |  
		|  |  
		| MOD Fleißiger Referenzredakteur
 
  
 Anmeldungsdatum: 10.09.2007
 Beiträge: 1003
 
 
 |  |  
		| Nach oben |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 05.01.2013, 17:55    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 06.01.2013, 00:25    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 06.01.2013, 14:05    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 06.01.2013, 14:20    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 06.01.2013, 14:35    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 06.01.2013, 14:52    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 06.01.2013, 17:09    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 06.01.2013, 17:12    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 06.01.2013, 17:51    Titel: |   |  
				| 
 |  
				| oha ok... bis jetzt hab ich immer alles was ich gemacht habe nur mit End beendet. gut zu wissen |  |  
		| Nach oben |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 06.01.2013, 18:00    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 06.01.2013, 18:08    Titel: |   |  
				| 
 |  
				| achso ok |  |  
		| Nach oben |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 11.01.2013, 15:36    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 11.01.2013, 15:42    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 11.01.2013, 18:59    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 11.01.2013, 19:02    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| braesident 
 
 
 Anmeldungsdatum: 15.04.2008
 Beiträge: 189
 Wohnort: Berlin
 
 | 
			
				|  Verfasst am: 11.01.2013, 20:32    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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.
 
 |  |