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:

Online Kartenspiel
Gehe zu Seite Zurück  1, 2
 
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
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 09.01.2011, 22:03    Titel: Antworten mit Zitat

Wie bereits genannt: 1. Kontrolle: Sobald Dein in FB programmierter Server läuft, musst Du ihn bei einem (Shell- bzw. CMD.EXE-Befehl!)
Code:
netstat -an

als LISTEN-Port sehen bzw. bei
Code:
netstat -ano
tasklist /v

(korrelierende PIDs!) sogar finden können! Linux: "lsof -i"
2. Kontrolle: Wenn Dein Client läuft und verbunden ist, ist dieser bei
Code:
netstat -ano
tasklist /v

bzw. "lsof -i" ebenfalls zu finden als ESTABLISHED.

Übrigens ruhig auch einmal probeweise mit Telnet auf den Server verbinden!

Von der Programmiertechnik selber: Zumindest in unixoiden Betriebssystemen bekommt man bei bind() (Standard-C-Bibliothek) einen Socket Descriptor (Filehandle). Diesen muss man in seinem C-Programm ebenfalls in den select()-Aufruf hineinnehmen. Statt Daten liegen dort bei einem Aufwecken jedoch einkommende Socketverbindungswünsche an, die man dort mit accept() wie ein klingelndes Telefon "abnimmt" -> accept() liefert dann einen neuen Socket Descriptor für diese eine Verbindung zurück, auf welcher danach normal read() und write() für Daten gelten. Auf diese Weise kann mein Rasterbike-Server praktisch beliebig viele Clients zu sich verbinden lassen, diese sieht man dann übrigens bei "netstat -an" als ESTABLISHED-Verbindungen.

Von der Programmiertechnik her würde ich in Deinem Fall ein TYPE verwenden, wo Zustandsinformationen für jeden aktiven Spieler gespeichert werden. Dabei z.B. ein
Code:
CONST maxSpieler AS Integer = 20
Dim s(0 To maxSpieler - 1) As SpielerType

hineinnehmen, dabei Deine accept()-Abfrage auch korrekt mit einem
Code:
If anzSpieler = maxSpieler Then
  ' Kein Platz mehr!
  ' Kurze Nachricht wie "Busy" definieren und senden
  ' Socket wieder schliessen
Else
  With s(anzSpieler)
     .foo = init
     .bar = init
     .sd = FileNummer
     ...
  End With
  anzSpieler = anzSpieler + 1
End If

Ich nehme einmal an, dass TSNE hoffentlich ganz ähnliche Mechanismen besitzt!

PS: Weil ich sein meinem Codesignierversuch selber mit FB etwas angefangen habe, müsste ich direkt einmal selber etwas Beispielcode bauen ;-)
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
FredKowalzki



Anmeldungsdatum: 03.01.2011
Beiträge: 13

BeitragVerfasst am: 10.01.2011, 07:24    Titel: Antworten mit Zitat

@dreael
Wenn ich dich richtig verstanden habe, dann scheinst du zu meinen, dass es am Server liegt, dass sich die Clients bei einem Verbindungsabbruch nicht mehr mit dem Server verbinden können. Dem ist allerdings nicht so.
Es liegt eindeutig am Client. Denn ich brauche nur den Client neu starten, dann klappt die Verbindung wunderbar. Aber genau das möchtie ich nicht. Natürlich wird irgendwo der Spielverlauf gespeichert, den sich der abgewürgte Client wieder einlesen könnte, so dass er sofort wieder auf dem aktuellen Stand wäre, aber ich finde es einfach uncool das ganze Programm neu zu starten. Ich denke man muss bestimmt "einfach" nur irgendwelche Flags auf Null setzen, weil irgendetwas "denkt" er wäre noch verbunden. Oder es ist etwas ganz anderes, woran es liegt - keine Ahnung lächeln
Genau das ist ja das Problem, dass ich etwas nutze, von dem ich keine Ahnung habe.
Naja, ich hoffe irgendjemand hat noch mal einen Denkanstoss für mich lächeln

(edit:) Ich habe etwas herausbekommen. Probieren hilft manchmal schon.
Bevor sich der Client neu verbindet folgenden Befehl ausführen lassen:
i = TSNEPlay_CloseAll()
Ich weiss allerdings noch nicht, ob damit alle Clients was-auch-immer schliessen. Evtl. müssen sich dann alles Clients neu anmelden, aber das wäre ja ggf. nur ein Mausklick, also kein Drama.

Fred
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 10.01.2011, 19:14    Titel: Antworten mit Zitat

Ich vermute mal, dass für den Client die Verbindung noch besteht, auch wenn die Gegenstelle nicht mehr antwortet. Mit TSNEPlay_CloseAll() würde dann die alte Verbindung geschlossen und die "Leitung" frei für eine neue Verbindung werden. Ist aber nur Spekulation, weil ich mich dazu zu wenig mit Netzwerksachen auskenne.

Das TSNEPlay_CloseAll() und die Neuverbindung müsste auf jeden Fall jeder Client für sich selbst ausführen. Client A weiß ja mangels Server nicht mehr, was Client B macht.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 10.01.2011, 21:56    Titel: Antworten mit Zitat

FredKowalzki hat Folgendes geschrieben:
Wenn ich dich richtig verstanden habe, dann scheinst du zu meinen, dass es am Server liegt, dass sich die Clients bei einem Verbindungsabbruch nicht mehr mit dem Server verbinden können.

Ob es nur am Client oder Server liegt, habe ich grundsätzlich überhaupt nicht gesagt. Ich versuchte Dir ein paar einfache Hilfsmittel auf der Kommandozeile zur Verfügung zu stellen, um das Verhalten auf TCP/IP-Ebene besser analysieren zu können. Der Befehl
Code:
netstat

ist eine relativ einfache Möglichkeit, für vertieftere Analysen kann ein Packet Sniffer sehr hilfreich sein, z.B. zwischen Deinem Client- und Server-PC ein Hub(!) schalten und auf einem dritten unter Linux laufenden PC ein "tcpdump" laufen lassen. Zur Not tut es auch auf dem einen PC selber eine Rootshell (=ein mit "runas /user:Administrator" gestartetes CMD.EXE) und dort "tcpdump" ausführen. => Mit "tcpflow" kannst Du dann anschliessend aus dem Capture-Tracefile die Socket-Sitzungen wieder zusammenpuzzeln und so schlussendlich überprüfen, ob die Deine beiden FreeBasic-Programme die korrekten Daten untereinander austauschen. In diesem Zusammenhang hätte ich als Debug-Hilfsmittel noch ein kleines Tool in C für Linux:

http://beilagen.dreael.ch/cprog/mini_gateway.c

=> am besten mit dem GCC kurz übersetzen und starten -> jetzt musst Du mit Deinem Client über diesen Gateway verbinden, schon bekommst Du im Linux-Konsolenfenster den gesamten Socketverkehr als Hexdump angezeigt, wobei die beiden Farben der Kommunikationsrichtung entsprechen. Auf diese Weise habe ich seinerzeit mein Rasterbike debuggt.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 18.01.2011, 16:15    Titel: Antworten mit Zitat

Fehler beim compilieren mit der testplay.bas und der TSNEplay_V3.bi :

Zitat:

C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(225) error 41: Variable not declared, TSNE_GetGURUCode in 'Case Else : Return TSNE_GetGURUCode(V_GuruCode)'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(288) error 41: Variable not declared, TSNE_Data_Send in 'TSNE_Data_Send(TSNEPlay_INT_Client_TSNEID, V_Data)'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(300) error 67: Array not dimensioned, before '(' in 'TSNE_Data_Send(TSID, V_Data)'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(324) error 67: Array not dimensioned, before '(' in 'TSNE_Data_Send(DD(X), V_Data)'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(342) error 41: Variable not declared, TSNE_Disconnect in 'If TPtr = 0 Then MutexUnLock(TSNEPlay_INT_Mutex): TSNE_Disconnect(V_TSNEID): Exit Sub'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(363) error 67: Array not dimensioned, before '(' in 'If TPtr = 0 Then MutexUnLock(TSNEPlay_INT_Mutex): TSNE_Disconnect(V_TSNEID): Exit Sub'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(374) error 67: Array not dimensioned, before '(' in 'TSNE_Data_Send(V_TSNEID, TSNEPlay_INT_CreateStreamCommand(TSNEPlay_INT_MSGT_NeedPassword))'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(375) error 67: Array not dimensioned, before '(' in 'Else: TSNE_Data_Send(V_TSNEID, TSNEPlay_INT_CreateStreamCommand(TSNEPlay_INT_MSGT_GetInfo, Str(TPID)))'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(388) error 67: Array not dimensioned, before '(' in 'TSNE_Data_Send(V_TSNEID, TSNEPlay_INT_CreateStreamCommand(TSNEPlay_INT_MSGT_StreamError))'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(389) error 67: Array not dimensioned, before '(' in 'TSNE_Disconnect(V_TSNEID)'
C:\Dokumente und Einstellungen\peter\Eigene Dateien\Downloads\TSNEplay_V3.bi(389) error 123: Too many errors, exiting

Build error(s)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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 Zurück  1, 2
Seite 2 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