 |
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: 25.02.2006, 20:43 Titel: Problem mit Masterserver |
|
|
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.
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!
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 |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 26.02.2006, 14:52 Titel: |
|
|
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
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 |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 26.02.2006, 16:33 Titel: |
|
|
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 |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 26.02.2006, 20:08 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.02.2006, 00:03 Titel: |
|
|
das is ne library function.. schon mal was von SDL gehört? irgendwo? 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 |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 27.02.2006, 01:59 Titel: |
|
|
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 |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 27.02.2006, 17:43 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.02.2006, 20:16 Titel: |
|
|
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 |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 27.02.2006, 22:15 Titel: |
|
|
Seitenlang |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 27.02.2006, 23:06 Titel: |
|
|
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 |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 28.02.2006, 17:32 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 28.02.2006, 23:15 Titel: |
|
|
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 |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 01.03.2006, 16:35 Titel: |
|
|
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 . 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 |
|
 |
|
|
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.
|
|