 |
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 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 09.01.2011, 22:03 Titel: |
|
|
Wie bereits genannt: 1. Kontrolle: Sobald Dein in FB programmierter Server läuft, musst Du ihn bei einem (Shell- bzw. CMD.EXE-Befehl!)
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 |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 10.01.2011, 07:24 Titel: |
|
|
@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
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
(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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 10.01.2011, 19:14 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.01.2011, 21:56 Titel: |
|
|
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
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 |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 18.01.2011, 16:15 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|