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:

Netzwerkcode für 4 stürzt ab

 
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: 04.12.2005, 15:36    Titel: Netzwerkcode für 4 stürzt ab Antworten mit Zitat

Hallo!

Ich programmiere zurzeit an einem Spiel, das zu 2. etwas sinnlos ist. Also habe ich begonnen, das ganze für 4 Spieler zu machen.

Dazu habe ich versucht einen Code zu schreiben, der 3 Computer mit einem Server verbindet, und der Server soll dann die Daten zwischen den 3 Computern verteilen. Zuerst soll das mal mit einer Zufallszahl laufen.

Dafür habe ich folgenden Code geschrieben:

Code:
'$INCLUDE: "SDL/SDL_NET.bi"
DECLARE SUB Server(sock1 AS tcpsocket, sock2 AS tcpsocket, sock3 AS tcpsocket)
DECLARE SUB client(sock AS tcpsocket, nr AS integer)

OPTION EXPLICIT

TYPE spielereigenschaften
    gold AS integer
    goldmiene AS integer
    krieger AS integer
    wall AS integer
    angreifen AS integer
    sock AS tcpsocket
END TYPE

DIM spieler(5) AS spielereigenschaften

DIM dummy AS string
DIM nummer AS integer

IF SDLNet_Init() <> 0 THEN 
    PRINT "Fehler"
    SLEEP
    END
END IF
PRINT "1-Server"
PRINT "2-Client"
DO
    dummy$=INKEY$
    nummer=VAL(dummy$)
    IF dummy$=CHR$(27) THEN END
LOOP UNTIL nummer=1 OR nummer=2
DIM slnummer AS integer'Nummer, die man selbst ist
IF nummer=1 THEN
    CALL Server(spieler(1).sock, spieler(2).sock, spieler(3).sock)
    slnummer=1
END IF
IF nummer=2 THEN
    DIM sersock AS tcpsocket
    CALL client(sersock, slnummer)
END IF
'alle clienten sind nun verbunden
spieler(slnummer).gold=RND*100+1

IF slnummer>1 THEN
    SDLNET_TCP_SEND(sersock, @spieler(slnummer).gold,LEN(spieler(slnummer).gold))
END IF

IF slnummer=1 THEN
    SDLNET_TCP_RECV(spieler(2).sock, @spieler(2).gold,LEN(spieler(2).gold))
    SDLNET_TCP_RECV(spieler(3).sock, @spieler(3).gold,LEN(spieler(3).gold))
    SDLNET_TCP_RECV(spieler(4).sock, @spieler(4).gold,LEN(spieler(4).gold))
END IF

PRINT spieler(1).gold
PRINT spieler(2).gold
PRINT spieler(3).gold
PRINT spieler(4).gold
SLEEP
END

SUB Server(sock1 AS tcpsocket, sock2 AS tcpsocket, sock3 AS tcpsocket)
 PRINT "Warte auf Client..."
 DIM sock AS tcpsocket'Socket einstellen
 DIM ip AS ipaddress
 DIM x AS integer
 SDLNet_Write32( INADDR_ANY, @ip.host )
 SDLNet_Write16( 5678, @ip.port )
 sock = SDLNet_TCP_Open( @ip )'eigener Serversocket
 x=1
 WHILE sock1 = NULL
    IF INKEY$=CHR$(27) THEN END
    sock1 = SDLNet_TCP_Accept( sock )
    SLEEP 25
 WEND
 SDLNET_TCP_SEND(sock1, @x,LEN(x))
 x=2
 WHILE sock2 = NULL
    IF INKEY$=CHR$(27) THEN END
    sock2 = SDLNet_TCP_Accept( sock )
    SLEEP 25
 WEND
 SDLNET_TCP_SEND(sock2, @x,LEN(x))
 x=3
 WHILE sock3 = NULL
    IF INKEY$=CHR$(27) THEN END
    sock3 = SDLNet_TCP_Accept( sock )
    SLEEP 25
 WEND
 SDLNET_TCP_SEND(sock3, @x,LEN(x))
END SUB

SUB client(sock AS tcpsocket, nr AS integer)
 DIM x As integer
 DIM host AS string
 DIM ip AS ipaddress
 INPUT "IP Addresse des Hostes: ", host$
 SDLNet_ResolveHost( @ip, host$, 5678 )
 sock = SDLNet_TCP_Open( @ip )
 SDLNET_TCP_RECV(sock, @x,LEN(x))
END SUB


Leider stürzt der Code beim ausführen ab, wahrscheinlich, weil die Clienten schon senden, während der Server noch auf Clienten wartet.

Hat jemand eine Idee, wie man dieses Problem verhindern könnte?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 04.12.2005, 15:50    Titel: Antworten mit Zitat

äh... der servger köntne den clienten ein *ping* signal senden, welches denen angiebt, dass sie ab diesem *ping* an ihn senden können und das spiel begonnen hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 04.12.2005, 16:01    Titel: Antworten mit Zitat

Hab ich mir auch erst überlegt, Problem dabei:
Dann müsste man eine Schleife machen, in der der user empfängt, und wenn was kommt, dann würde er weiter machen. Doch wenn der 5 mal empfängt, ohne, das was kommt, dann stürzt es ab...
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