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:

Problem mit Masterserver

 
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
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 25.02.2006, 20:43    Titel: Problem mit Masterserver Antworten mit Zitat

Hallo Leute!

Ich programmiere jetzt schon die halben Ferien an einem Masterserver.
Das soll folgendermaßen funktionieren: der Server wird geöffnet, dann kommen alle Clienten zum Server. Wenn dann genug clienten da sind, dann legt der Server Paare fest, und diese Paare sind dann jeweils ein Server und ein Client und spielen gegeneinander. Der der gewinnt, verbindet sich wieder und dann geht das wieder los usw. Dazu habe ich mir erst folgenden Code überlegt:

http://www.freebasic.de/fbnp/index.php?view=237 (Server)
http://www.dagere.de/neu.txt (Client)

(Der zweite Code war zu groß für Nopaste)

Das hat erstmal ganz gut funkioniert. Doch irgendwann kam ein Fehler, und der Client hat(aus unerfindlichen Gründen) nicht mehr mitbekommen, wenn das Spiel beginnen sollte.

Das hat mich erstmal sehr traurig gemacht, weil ich ja ziemlich lange dran gearbeitet hatte. weinen

Da mir aber letztendlich niemand helfen konnte, und ich keine Ahnung hatte woran es lag, entsann ich mich eines alten Rates aus dem IRC Channel "Am Anfang muss man halt alles mehrmals programmieren". Also gut, hab ich mich an die Arbeit gemacht. Diesmal hab ich gleich überall wo es mir einfiel Fehler abgefangen, mit SDLNET_GetError() angezeigt und so weiter. Außerdem hab ich das ganze kräftig entrümpelt, und z.B. beim Server die SDL Graphikkomponenten entfernt, und mich auf die DOS Box beschränkt.

http://www.freebasic.de/fbnp/index.php?view=238(Server)
http://www.freebasic.de/fbnp/index.php?view=239(Client)

Dieser Client war zwar nur DOS Box basierend(und deshalb war kein Spiel möglich), aber immerhin, die Paarzuweisung funktionierte und das ganze hat getan, was ich wollte. Dann musste ich - sonst kann ich ja mein SDL Spiel nicht drauf machen - wohl oder übel das ganze zumindest beim Clienten in eine SDL Graphik packen. Damit hab ich dann also begonnen, und bin auf diesen Code gekommen:

http://www.freebasic.de/fbnp/index.php?view=241

Und plötzlich ist wieder der Wurm drinne! Plötzlich empfängt der wieder nichts! mit dem Kopf durch die Mauer wollen

Ich hab sogar mal probiert, einen SDL Clienten und einen normalen zu verbinden - Ergebniss: Der normale macht brav, was zu tun war, und der andere laggt rum(ist aber nicht bei dem Sleep).

Kann mir einer von euch vielleicht sagen, wieso mit ein bisschen SDL Graphik der Client nichts mehr empfängt, oder wie man diese Problem beheben kann?


/EDIT: Mangels irgendwelcher Ideen habe ich noch mal von der DOS Version aus begonnen, und immer jede Veränderung getestet. Folgender Code funktioniert:

Code:
'$INCLUDE: "SDL/SDL.bi"
'$INCLUDE: "SDL/SDL_Net.bi"
'$INCLUDE: "SDL/SDL_TTF.bi"

DECLARE SUB anz_txt(x As integer, y AS integer, farbe AS SDL_Color, text$, schriftarteing AS TTF_Font PTR)
DECLARE SUB hauptserververbind(spielername AS string)

OPTION EXPLICIT

const NEWLINE=CHR$(10,13)

PRINT "Initiallisiere SDL_NET..."
IF SDLNET_INIT()<>0 THEN
    PRINT "Fehler"+*SDLNET_GetError()
    SLEEP
    END 1
END IF

PRINT "Initiallisiere SDL"
IF SDL_INIT(SDL_INIT_Video)<>0 THEN
    PRINT "Fehler"+*SDL_GetError()
    SLEEP
    END 2
END IF

PRINT "Initiallisiere SDL_TTF"
IF TTF_INIT()<>0 THEN
    PRINT "Fehler"
    SLEEP
    END 3
END IF

DIM SHARED bildschirm AS SDL_Surface PTR
DIM SHARED schriftart AS TTF_Font PTR
DIM SHARED schriftartk AS TTF_Font PTR
DIM SHARED threadcontrol, mutex

schriftart=TTF_OpenFont("Daten/Vera.ttf", 20)
IF schriftart=NULL THEN
    ? "Fehler beim Laden der Schriftart"
    SLEEP
    END 2
END IF
schriftartk=TTF_OpenFont("Daten/Vera.ttf", 16)
IF schriftartk=NULL THEN
    ? "Fehler beim Laden der Schriftart"
    SLEEP
    END 2
END IF

bildschirm=SDL_SetVideoMode(640,480,16,SDL_DoubleBuf)
IF bildschirm=NULL THEN
    PRINT "Fehler: "+*SDL_GetError()
    SLEEP
    END 1
END IF

mutex=MUTEXCREATE

CALL hauptserververbind("Testspieler")

END

SUB hauptserververbind(spielername AS string)
    DIM sname AS string*10
    DIM iphauptserver AS string*15
    DIM ipspielserver AS string*15
    DIM iprhauptserver AS ipaddress
    DIM iprspielserver AS ipaddress
    DIM sockspielserver AS tcpsocket
    DIM sockhauptserver AS tcpsocket
    DIM sockclient AS tcpsocket
    DIM AS integer pw, gewinn, warten
    DIM farbe AS SDL_Color, ereigniss AS SDL_Event
    'iphauptserver$=IPGet()
    iphauptserver$="127.0.0.1"
   
    sname$=LEFT(spielername$, 10)
    pw=0
   
    WHILE gewinn=0
        pw+=1
        SDL_FillRect(bildschirm, NULL, SDL_MapRGB(bildschirm->format, 0,0,255))
        anz_txt(0,0, farbe, "Verbinde mit Server, Runde: "+STR$(pw), schriftart)
        SDL_Flip(bildschirm)
        IF SDLNET_ResolveHost(@iprhauptserver, iphauptserver$, 5678)<>0 THEN
            anz_txt(0,20,farbe, "Fehler: "+*SDLNET_GetError(), schriftart)
            SLEEP
            END 4
        END IF
       
        sockhauptserver=SDLNET_TCP_Open(@iprhauptserver)
        IF sockhauptserver=NULL THEN
            anz_txt(0,20,farbe, "Fehler: "+*SDLNET_GetError(), schriftart)
            SLEEP
            END 5
        END IF
       
        anz_txt(0,20, farbe,"Sende Spielerdaten...", schriftart)
        anz_txt(0,20, farbe,"Runde: "+STR$(pw)+" Name: "+STR$(sname), schriftart)
        SDLNET_TCP_Send(sockhauptserver, @pw, LEN(pw))
        SDLNET_TCP_Send(sockhauptserver, @sname, LEN(spielername))
       
        anz_txt(0,40, farbe,"Warte auf Turnierbeginn...", schriftart)
        warten=3
        WHILE warten=3
            IF INKEY$=CHR$(27) THEN END
            SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))
        WEND
       
        IF warten=2 THEN
            SDLNET_TCP_Recv(sockhauptserver, @ipspielserver$, LEN(ipspielserver$))
        END IF
       
        IF warten=4 THEN
            PRINT "Herzlichen Glückwunsch, sie haben keinen Gegner abbekommen und sind weiter"
        END IF
       
        PRINT "Schließe Verbindung mit Hauptserver"
        SDLNET_TCP_Close(sockhauptserver)
        sockhauptserver=NULL
       
        IF warten=1 THEN
            PRINT "Server wird erstellt..."
            IF SDLNET_Resolvehost(@iprspielserver, NULL, 5677)<>0 THEN
                PRINT "Fehler: " + *SDLNET_GetError()
                SLEEP
                END 6
            END IF
           
            sockspielserver=SDLNET_TCP_Open(@iprspielserver)
            IF sockspielserver=NULL THEN
                PRINT "Fehler: " + *SDLNET_GetError()
                SLEEP
                END 7
            END IF
           
            WHILE sockclient=NULL
                sockclient=SDLNET_TCP_Accept(sockspielserver)
            WEND
           
            PRINT "Server wird geschlossen"
            SDLNET_TCP_Close(sockclient)
            sockclient=NULL
            SDLNET_TCP_Close(sockspielserver)
            sockspielserver=NULL
            SLEEP
        END IF
       
        IF warten=2 THEN
            PRINT "Verbinde mit Server..."
            IF SDLNET_Resolvehost(@iprspielserver, ipspielserver$, 5677)<>0 THEN
                PRINT "Fehler:" + *SDLNET_GetError()
                SLEEP
                END 9
            END IF
           
            sockspielserver=SDLNET_TCP_Open(@iprspielserver)
            IF sockspielserver=NULL THEN
                PRINT "Fehler: " + *SDLNET_GetError()
                SLEEP
                END 10
            END IF
           
            PRINT "Schliesse Verbindung mit Server"
            SDLNET_TCP_Close(sockspielserver)
            sockspielserver=NULL
            SLEEP
        END IF
       
    WEND
END SUB

SUB anz_txt(x As integer, y AS integer, farbeanz AS SDL_Color, text$, schriftarteing AS TTF_Font PTR)
   DIM tempsurf AS SDL_Surface PTR
   DIM AS SDL_Rect recht1, recht2
   
   tempsurf=TTF_RenderText_Blended(schriftarteing,text$, farbeanz)
   
   recht1.x=0
   recht1.y=0
   recht1.w=tempsurf->w
   recht1.h=tempsurf->h
   
   recht2.x=x
   recht2.y=y
   
   SDL_BlitSurface(tempsurf, @recht1, bildschirm, @recht2)
   
   SDL_FreeSurface(tempsurf)
END SUB


Das verwunderliche: verändere ich die schleife, in der auf den Turnierbeginn gewartet wird, wie folgt:

Code:
        WHILE warten=3
            WHILE SDL_PollEvent(@ereigniss)
                IF ereigniss.type=SDL_Quit_ THEN END
                IF ereigniss.key.keysym.sym=SDLK_Escape THEN END
            WEND
           
            SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))
            SDL_Flip(bildschirm)
        WEND


geht gar nix mehr. Hat einer eine Idee, wieso?(und noch viel wichtiger, wie ich es bekämpfen kann!)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 26.02.2006, 14:52    Titel: Antworten mit Zitat

Hallo Progger X

Da du bestimmt weißt, daß Programmierer (und solche die es werden wollen = ich ) stinkefaul sind, steige ich erst mal nicht tiefer in deinen Source ein. Denn mir sind zwei Sachen aufgefallen, die du erst mal prüfen solltest.

In deinem Post verlinkst du mit http://www.freebasic.de/fbnp/index.php?view=241 auf ein Listing, aus dem ich nun ein Stück zitiere:
Code:

        '' Warten auf Turnierbeginn
        '' !KRITISCHE STELLE!
        anz_txt(0,60,farbe, "Warte auf Turnierbeginn..", schriftart)
        warten=3
        PRINT "Warte auf Turnierbeginn..."
        WHILE warten=3
            SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))
            PRINT "Status: "+STR$(warten)+*SDLNET_GetError()
        WEND
 

zu diesem Passus ist ja klar zu sagen, die While-Wend-Schleife hält den Programmablauf in sich fest, bis sich die Variable "warten" ändert! Und das kann ja nur innerhalb dieser Schleife passieren, denn nix anderes wird mehr ausgeführt. Es sei denn, da liefe noch ein Thread, also eine Programmschleife, die wie ein anderes, zweites Programm per Multitasking separat abläuft, und dabei aber auf die Variablen aus deinen eigentlichen Routinen zugreift.

an 2 Stellen ist jetzt zu prüfen, ob "warten" verändert wird, während While-Wend läuft:

1) Prüfe, ob mit dem Upro-Aufruf SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten)) der Inhalt der Variablen "warten" auf einen anderen Wert als "3" geändert wird, also schlichtweg, in einer deiner "*.bi" Dateien muß es eine Sub oder Function geben, die "SDLNET_TCP_Recv" heißt, und innerhalb dieser Prozedur ist zu prüfen, ob "warten" beeinflußt wird. Da du per @warten die Speicheradresse von "warten" übergibst, kann "SDLNET_TCP_Recv" ja, auf "warten" zugreifen. Aber ob es das auch tut?

2) Dein Listing enthält zwar "Mutex-Teile" und dimmt auch eine Variable namens "threadcontrol", aber ich finde nichts, daß per "threadcreate" ein Thread auch gestartet werden würde. Und das, obwohl du mit einer Zeile: mutex=MUTEXCREATE dein Programm darauf vorbereitest, Variablen sperren zu können, wenn ein Thread in Programmvariablen hineingreift:
Prüfe in den "includeten Dateien", ob eine SUB als Thread per "Threadcreate(@SubNamen)" gestartet wird und falls ja, ob in dieser Sub=Thread der Wert von "warten" geändert wird.

Solltest du damit nun feststellen, daß "warten" gar nicht verändert wird, während die While-Wend-Schleife abläuft, weißt du ja, warum dein Programm dort hängen bleibt zwinkern

Nebenbei noch: Solltest du feststellen, daß kein Thread gestartet wird, dann sind die Zeilen mit "mutex" und "Threadcontrol" überflüssig und verwirren den Leser des Listings.

Hoffe das hilft, melde dich, was du gefunden hast

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 26.02.2006, 16:33    Titel: Antworten mit Zitat

Danke für deine Antwort.

Nein, es gibt keinen Thread, der einzige Sinn dieser Dinger ist es, für ein späteres Spiel(mit SDL Graphik) da zu sein(dieses dingens hat threads).

Ja, diesen Befehl gibt es, und er arbeitet beim Server wunderbar.

Ich weiß, das mein Programm dort hängen bleibt...das Problem ist: wie krieg ich das weg??
Selbst wenn ich PRINT "Warten: "+STR$(warten) rein mache, dann geht es nicht. Nur wenn ich die REINE Schleife, mit SDLNET_RECV rein mache, klappt es. Ein bissl Graphik und schon funzt nix mehr.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 26.02.2006, 20:08    Titel: Antworten mit Zitat

Hi Progger_X

um darauf eingehen zu können, müßte ich die Routine "SDLNET_TCP_Recv" ansehen können. Die scheint ja in einer deiner "*.bi"-Dateien zu stecken. Kannst du die mal posten? online-stellen? oder schicken?
Auch auf die Gefahr hin, daß ich nicht blicke, was da drinne steht?

bin ja gespannt

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.02.2006, 00:03    Titel: Antworten mit Zitat

das is ne library function.. schon mal was von SDL gehört? irgendwo? zwinkern Das is n ganz normaler blocking network recieve call. in der bi steht nur der declare-befehl, der bringt dir ja nix..
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 27.02.2006, 01:59    Titel: Antworten mit Zitat

DaGeRe hat Folgendes geschrieben:
Das verwunderliche: verändere ich die schleife, in der auf den Turnierbeginn gewartet wird, wie folgt:


Code:

        WHILE warten=3
            WHILE SDL_PollEvent(@ereigniss)
                IF ereigniss.type=SDL_Quit_ THEN END
                IF ereigniss.key.keysym.sym=SDLK_Escape THEN END
            WEND
           
            SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))
            SDL_Flip(bildschirm)
        WEND   


geht gar nix mehr. Hat einer eine Idee, wieso?(und noch viel wichtiger, wie ich es bekämpfen kann!)


Hallo.
Prüf doch mal, ob die 2. while:wend schleife "hängt", also teste mal den code:

Code:

        WHILE warten=3
            WHILE SDL_PollEvent(@ereigniss)
                IF ereigniss.type=SDL_Quit_ THEN END
                IF ereigniss.key.keysym.sym=SDLK_Escape THEN END
                Print "blabla1"
            WEND

            Print "blabla2"
            SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))
            SDL_Flip(bildschirm)
        WEND   


Lass dir halt was bei blabla1 und blabla2 einfallen. So kannst du eigentlich genau sehen, wo jetzt da was hängt.

Michael
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 27.02.2006, 17:43    Titel: Antworten mit Zitat

Nein, das ist das total komische.
Selbst

Code:
WHILE warten=3
  SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))
 PRINT "Bla"
  WEND   

lässt das empfangen nicht mehr funktionieren(bla wird trotzdem angezeigt).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.02.2006, 20:16    Titel: Antworten mit Zitat

und wie oft?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 27.02.2006, 22:15    Titel: Antworten mit Zitat

Seitenlang
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 27.02.2006, 23:06    Titel: Antworten mit Zitat

Hmm..
Dann mach doch einmal Print "bla";warten.
Dann müsstest du ja sehen ob der wert vom Server falsch gesendet wird, oder ob ein anderes Problem vorliegt.

Michael
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 28.02.2006, 17:32    Titel: Antworten mit Zitat

Hab ich auch schon probiert. Das Ding bliebt bei 3. Es ist total paradox, und ich weiß net wieso - aber es ist so.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 28.02.2006, 23:15    Titel: Antworten mit Zitat

ich würde sagen deine verbindung is irgendwo weg weil du sendest ja nich dauernd und wenn nix gesendetes da is aber die verbindung steht bleibt recv stecken und blockt bis was kommt. Folglich hast du vermutlich die verbindung nich neu aufgebaut oder unbeabsichtigs getrennt oder irgendwas in der richtung..
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 01.03.2006, 16:35    Titel: Antworten mit Zitat

Würd ich ja auch sagen, aber der Code ist ja nicht anders, als der Code, bei dem es funktioniert, bis auf diese Graphikanzeige...

Ich machs jetzt einfach so: beim Clienten gibt's ne DOS-Box, in der wird alles gemacht, bis das Spiel beginnt, dann geht das SDL Fenster auf, und danach wieder zu.

/EDIT: Das war wohl nix mit dem Kopf durch die Mauer wollen . Habs gerade auf verschiedenen Computern getestet. Und seltsamerweise empfängt nur der 600 Mhz'er was, wenn die Runde begonnen wird, die anderen beiden zeigen nen Fehler an. Veränderter Code:

Server
Code:
WHILE ende=0
    taste$=INKEY$
    IF taste$=CHR$(27) THEN END
    IF taste$="l" THEN
        FOR zahler=1 TO spielermax
            PRINT clienten(zahler).sname
        NEXT
    END IF
    IF taste$=CHR$(13) THEN
        FOR zahler=1 TO spielermax-2 STEP 2
            spielertypzahler=1
            IF spielertypzahler=1 THEN PRINT "Server:";
            PRINT STR$(spielertypzahler)+" Name: "+clienten(zahler).sname
            IF SDLNET_TCP_Send(clienten(zahler).sock, @spielertypzahler, LEN(spielertypzahler))<LEN(spielertypzahler) THEN
                PRINT "Fehler beim Senden zum Server, "+*SDLNET_GetError()
            END IF
            spielertypzahler=2
            IF spielertypzahler=2 THEN PRINT "Client:";
            PRINT STR$(spielertypzahler)+" Name: "+clienten(zahler+1).sname
            IF SDLNET_TCP_Send(clienten(zahler+1).sock, @spielertypzahler, LEN(spielertypzahler))<LEN(spielertypzahler) THEN
                PRINT "Fehler beim Senden zum Clienten, "+*SDLNET_GetError()
            END IF
            IF SDLNET_TCP_Send(clienten(zahler+1).sock, @clienten(zahler).ipstring, LEN(clienten(zahler).ipstring))<LEN(clienten(zahler).ipstring) THEN
                PRINT "Fehler beim Senden der IP zum Clienten, "+*SDLNET_GetError()
            END IF
            SDLNET_TCP_Close(clienten(zahler).sock)
            SDLNET_TCP_Close(clienten(zahler+1).sock)
            clienten(zahler).sock = NULL
            clienten(zahler).sname = ""
            clienten(zahler).ipstring = ""
            clienten(zahler).con = 0
            clienten(zahler+1) = clienten(zahler)
        NEXT
        IF spielermax<>zahler THEN
            spielertypzahler=4
            IF spielertypzahler=4 THEN PRINT "Zuschauer:";
            PRINT STR$(spielertypzahler)+" Name:" +clienten(spielermax-1).sname
            IF SDLNET_TCP_Send(clienten(spielermax-1).sock, @spielertypzahler, LEN(spielertypzahler))<LEN(spielertypzahler) THEN
                PRINT "Fehler, "+*SDLNET_GetError()
                SLEEP
            END IF
            SDLNET_TCP_Close(clienten(spielermax-1).sock)
            clienten(spielermax-1).con = 0
            clienten(spielermax-1).ipstring = ""
            clienten(spielermax-1).sname = ""
            clienten(spielermax-1).sock=NULL
        END IF
        PRINT spielermax
        spielermax = 1
        pw + = 1
        PRINT "Runde:" + STR$(pw)
    END IF
   
    IF rundeaktiv=3 THEN
        clienten(spielermax).sock=SDLNET_TCP_Accept(serversocket)
        IF clienten(spielermax).sock<>NULL THEN
            PRINT "Neuer Client eingetroffen"
            SDLNET_TCP_Recv(clienten(spielermax).sock, @pwempf, LEN(pwempf))
            IF pwempf<>pw THEN
                PRINT "Client ist nicht in der selben Runde..."
                SDLNET_TCP_Close(clienten(spielermax).sock)
            ELSE
                clienten(spielermax).con=1
                IF SDLNET_TCP_Recv(clienten(spielermax).sock, @clienten(spielermax).sname, LEN(clienten(spielermax).sname))<LEN(clienten(spielermax).sname) THEN
                    PRINT "Fehler: "+*SDLNET_GetError()
                END IF
                PRINT "Name: "+clienten(spielermax).sname
                clienten(spielermax).ip=SDLNET_TCP_GetPeerAddress(clienten(spielermax).sock)
                clienten(spielermax).ipstring=IPv4ToStr(@clienten(spielermax).ip->host)
                PRINT "IP: "+clienten(spielermax).ipstring
                spielermax+=1
            END IF
        END IF
        FOR zahler=1 TO spielermax
            IF clienten(zahler).con=1 THEN
                IF SDLNET_TCP_Send(clienten(zahler).sock, @rundeaktiv, LEN(rundeaktiv))<LEN(rundeaktiv) THEN
                    PRINT "Verbindung zu einem Clienten beendet"
                    clienten(zahler).con=0
                END IF
                IF SDLNET_TCP_Recv(clienten(zahler).sock, @dummy, LEN(dummy))<LEN(dummy) THEN
                    PRINT "Fehler beim Empfangen"
                END IF
            END IF
        NEXT
    END IF
   
    SLEEP 10
WEND

(hier wird einmal angezeigt empfangen nicht möglich, bei jedem weiteren Durchlauf funktioniert das jedoch)

Code:
    WHILE gewinn=0
        pw+=1
        PRINT "Verbinde mit Server, Runde: "+STR$(pw)
        IF SDLNET_ResolveHost(@iprhauptserver, iphauptserver$, 5678)<>0 THEN
            PRINT "Fehler: "+*SDLNET_GetError()
            SLEEP
            END 4
        END IF
       
        sockhauptserver=SDLNET_TCP_Open(@iprhauptserver)
        IF sockhauptserver=NULL THEN
            PRINT "Fehler: "+*SDLNET_GetError()
            SLEEP
            END 5
        END IF
       
        PRINT"Sende Spielerdaten..."
        PRINT"Runde: "+STR$(pw)+" Name: "+STR$(sname)
        IF SDLNET_TCP_Send(sockhauptserver, @pw, LEN(pw))<LEN(pw) THEN
            PRINT "Fehler: "+*SDLNET_GetError()
        END IF
        IF SDLNET_TCP_Send(sockhauptserver, @sname, LEN(spielername))<LEN(spielername) THEN
            PRINT "Fehler: "+*SDLNET_GetError()
        END IF
       
        PRINT"Warte auf Turnierbeginn..."
        warten=3
        antwort=5
        WHILE warten=3           
            IF SDLNET_TCP_Recv(sockhauptserver, @warten, LEN(warten))<LEN(warten) THEN
                PRINT "Fehler: "+*SDLNET_GetError()
                PRINT "Warten: "+STR$(warten)
                SLEEP
            END IF
            IF SDLNET_TCP_Send(sockhauptserver, @antwort, LEN(antwort))<LEN(antwort) THEN
                PRINT "Fehler: "+*SDLNET_GetError()
                SLEEP
            END IF
            SLEEP 10
        WEND


Das ist der andere Code; auf meinem Rechner klappts, mit dem 600 Mhz'er auch. Jedoch mit den anderen Computern nicht(alle Win98 SE) komm "Fehler: "(leer) und "Warten: 3", obwohl das als gesendet angezeigt wurde. Woran kann das liegen? Und wie kann ich das beheben? Ich habs mit Server und Client bei den anderen Computern probiert, es ändert sich nichts.
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
Seite 1 von 1

 
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