 |
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 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 04.12.2005, 15:36 Titel: Netzwerkcode für 4 stürzt ab |
|
|
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 |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 04.12.2005, 15:50 Titel: |
|
|
ä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 |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 04.12.2005, 16:01 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|