Problem mit Readbyte(TCP)
Übersicht

![]() |
5k41Betreff: Problem mit Readbyte(TCP) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
Ich programmiere grade einen Chat und frage jeden Schleifendurchlauf per Readbyte ein statusbyte ab! Nun dachte ich mir ich sende um geschwindigkeit zu bekommen nur einmal ein Ping-Byte jede Minute oder wenn ein Spieler joint oder leaft oder ne nachricht geschrieben wird, da Readbyte ja sonst sicher 0 zurück geben wird, nur leider hängt sich mein Programm auf, sobald der Host nichts in das Byte schreibt (hab ich getestet). Wie kann ich ihm sagen das Readbyte 0 zurück geben soll und nicht auf antwort warten soll (geht das überhaut?) ? Wenn es nicht geht, wie soll ich das Problem dann Lösen? Vielen Dank für jede Antwort! MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auch wenn ich den Fehler an anderer Stelle vermute (ReadByte versucht nur aus einem Buffer zu lesen, wenn nichts drin ist gibt es 0 zurück. Warten auf irgendwas tut es nicht) ist es ohnehin gängige Praxis via ReadAvail erstmal zu überprüfen ob denn überhaupt was zum lesen da ist ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
JUHU!!! SOWAS GIBTS JA DOCH!!! Danke Hubsi suche schon die ganze Zeit fieberhaft nach sonem Befehl!!! Und sowieso musss der Fehler da liegen, da wenn ich nach dem Befehl ein Ende ausgeben lasse es erst nach dem zusammenbruch von ca. 20 sekunden kommt und davor sofort vor dem zusammenbruch...
DANKE!^^ ~Edit~ Mit Readavail keine verzögerung mehr da! hab nun aber ein anderes Problem... das bekomm ich auch noch in den Griff!!!^^ |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
So ich bins nochmal! Ich bin wieder Ratlos: Ich starte mein Programm 2 mal nun schreibt man eine Nachricht, jene kommt an aber sobald man nocheine schreibt kackt der an den die Nachricht ist ab und nach ca. 20 Sekunden bekommt der dann alle nachrichten die man bis dahin geschrieben hat in einer Nachricht zugeschickt. Danach empfängt er keine Nachrichten vom andern mehr und wenn man selbst eine schreibt, dann läuft sie einfach noch oben aus den Bild Ö.ö hoffe ihr könnt mir helfen ich bin echt ratlos!
Code: [AUSKLAPPEN] Graphics 400,200,32,2 SetBuffer BackBuffer() ;Constants----------------------------------------------- ;Variables----------------------------------------------- Type Tplayer Field ID% Field Name$ Field status$ Field timeout% End Type Type Tmessage Field message$ Field red% Field green% Field blue% End Type Name$="" IP$="" status="" msg$=0;Nachricht newp=0;Wenn neue Verbindung erkannt wurde tempName$="";Damit leave-nachricht nicht an leaver geschickt wird timeout%=0;wann ping gesendet werden muss ending=0;wenn Porg beendet werden muss avail=0;Temp vari für ReadAvail Const offline=0,online=1,nachricht=2,update=3,playerLeft=4,timeouttime%=100000 ;Bytekennung: O=offline;1=online;2=nachricht;3=update;4=player left ;Main---------------------------------------------------- Name$=Input("Dein Name: ") IP$=Input("Ip des Hosts: ") If IP="" Then server=CreateTCPServer(8080) If server<>0 Then AppTitle "Jama-Chat-Server":status=0 If server=0 Then Print "Es konnte kein Server erstellt werden!":WaitKey():End ElseIf IP<>"" Then strm=OpenTCPStream(IP,8080) If strm<>0 Then AppTitle "Jama-Chat-Client("+IP+")" WriteString strm,name$ host.Tplayer=New Tplayer host\ID=strm host\name$=ReadString(host\ID) host\timeout=MilliSecs()+timeouttime msg$=ReadString(host\ID) Repeat If stringSplitt$(msg$,",",counter)<>"" Then player.Tplayer=New Tplayer player\ID=Int(stringSplitt$(msg$,",",counter)) player\Name$=stringSplitt(msg$,",",counter+1) counter=counter+1 EndIf Until stringSplitt(msg$,",",counter+1)="" timeout=MilliSecs()+timeouttime ElseIf strm=0 Then Print "Es konnte keine Verbindung hergestellt werden!" WaitKey() End EndIf EndIf While Not KeyDown(1) ;New Player If IP="" Then newp=AcceptTCPStream(server) If newp<>0 And IP="" Then player.Tplayer=New Tplayer player\ID=newp player\name$=ReadString(newp) player\timeout=MilliSecs()+timeouttime txt(player\name$+" joined!") ;message.Tmessage=New Tmessage ;message\message$=player\name$+" joined!" ;message\red=255:message\green=255:message\blue=255 WriteString player\ID,name$ For p.Tplayer=Each Tplayer If p\ID<>player\ID Then WriteByte p\ID,update:WriteString p\ID,player\ID+","+player\name$ tempname$=p\ID+","+p\Name+"," EndIf Next WriteString player\ID,tempname$ ;WriteByte player\ID,onlie:timout=MilliSecs()+timeouttime EndIf ;Send If Not KeyDown(28) Then strg$=Input_ASCII$(0,200-FontHeight(),strg$,Name$) old%=blink(0,200-FontHeight(),old%,500,strg$) If KeyDown(28) And strg$<>"" Then If IP<>"" Then WriteByte host\ID,nachricht WriteString host\ID,Name$+":"+strg$ FlushKeys() ElseIf IP="" Then For p.Tplayer=Each Tplayer WriteByte p\ID,nachricht WriteString p\ID,Name$+":"+strg$ Next FlushKeys() EndIf txt(Name$+":"+strg$) ;message.Tmessage=New Tmessage ;message\message$=Name$+":"+strg$ ;message\red=255:message\green=255:message\blue=255 strg$="" Else If IP="" Then For p.Tplayer=Each Tplayer If timeout<=MilliSecs() Then WriteByte p\ID,online:timeout=MilliSecs()+timeouttime Next ElseIf IP<>"" Then If host.Tplayer<>Null And timeout<=MilliSecs() Then WriteByte host\ID,online:timeout=MilliSecs()+timeouttime EndIf EndIf ;Recieve If IP<>"" And host.Tplayer<>Null Then avail=ReadAvail(host\ID) If avail<>0 Then ident%=ReadByte(host\ID):avail=0 If ident=online Then host\timeout=MilliSecs()+timeouttime If ident>online Then msg$=ReadString(host\ID) If ident=nachricht Then;nachricht kommt txt(msg$) ;message.Tmessage=New Tmessage ;message\message$=msg$ ;message\red=255:message\green=255:message\blue=255 ElseIf ident=update Then;neuer Spieler player.Tplayer=New Tplayer player\ID=Int(stringSplitt$(msg$,",",0)) player\Name$=stringSplitt(msg$,",",1) txt(player\name$+" joined!") ;message.Tmessage=New Tmessage ;message\message$=player\name$+" joined!" ;message\red=255:message\green=255:message\blue=255 p.Tplayer=Last Tplayer ElseIf ident=playerLeft Then;Sonstwer wech txt(msg$+" left!") ;message.Tmessage=New Tmessage ;message\message$=msg$+" left!" ;message\red=255:message\green=255:message\blue=255 For p.Tplayer=Each Tplayer If p\name=msg$ Then Delete p.Tplayer Next EndIf If host\timeout<MilliSecs() Then;host wech txt("Host left!") txt("Press any Key to end!") ending=1 ;message.Tmessage=New Tmessage ;message\message$="Host left!" ;message\red=255:message\green=255:message\blue=255 Delete host.Tplayer EndIf ElseIf IP="" Then For p.Tplayer=Each Tplayer avail=ReadAvail(p\ID) If avail<>0 Then ident%=ReadByte(p\ID):avail=0 If ident=online Then p\timeout=MilliSecs()+timeouttime If ident>online Then msg$=ReadString(p\ID) If ident=nachricht Then txt(msg$) ;message.Tmessage=New Tmessage ;message\message$=msg$ ;message\red=255:message\green=255:message\blue=255 For send.Tplayer=Each Tplayer If send\ID<>p\ID Then WriteByte send\ID,2 WriteString send\ID,msg$ EndIf Next EndIf If p\timeout<MilliSecs() Then txt(p\Name+" left!") ;message.Tmessage=New Tmessage ;message\message$=p\Name+" left!" ;message\red=255:message\green=255:message\blue=255 tempName$=p\Name$ Delete p.Tplayer For lef.Tplayer=Each Tplayer WriteByte lef\ID,4 WriteString lef\ID,tempName$ Next EndIf Next EndIf count=0 For m.Tmessage=Each Tmessage Color m\red,m\green,m\blue Text 0,count*FontHeight(),m\message count=count+1 If count>14 Then Delete First Tmessage Next count=1 Text 400-StringWidth(Name),0,Name For p.Tplayer=Each Tplayer Text 400-StringWidth(p\Name),count*FontHeight(),p\Name count=count+1 Next count=0 Flip Cls If ending=1 Then WaitKey():End Wend End ;Functions---------------------------------------------------- ;-------------------------------------------------------------- ;Function to have an Inputroutine without Stopping the Programm ;-------------------------------------------------------------- Function Input_ASCII$(x,y,oldstrg$,name$) Local Key=GetKey() Local strg$=oldstrg$ If Not KeyDown(28) And StringWidth(name$+":"+strg$)<100 Then If key=8 And (Len(oldstrg$))>0 Then strg$=Left(oldstrg$,Len(oldstrg$)-1) ElseIf Key<>8 And Key<>0 And Key<>28 Then strg$=oldstrg$+Chr(key) EndIf EndIf Text x,y,strg$ Return strg$ End Function ;----------------------------------- ;Function to show a blinking coursor ;----------------------------------- Function blink(x,y,old%,delayer%,strg$) If MilliSecs()-old=>delayer Then Text x+StringWidth(strg$),y,"|":old=MilliSecs() Return old% End Function ;----------------------------------------- ;SPLITTS A STRING LIKE YOU WANT ;----------------------------------------- Function stringSplitt$(strg$,char$,selection%) Local newstrg$="" Local count%=0 If Instr(strg$,char$)>0 Then For i%=1 To Len(strg$) If Mid(strg$,i%,1)=char$ Then count%=count%+1:i=i+1 If count%=selection% Then newstrg$=newstrg$+Mid(strg,i%,1) If count%>selection% Then Exit Next Else newstrg$=strg$ EndIf Return newstrg$ End Function ;--------------------------------------- ;FUNKTION TO CREATE A MESSAGE ;--------------------------------------- Function txt.Tmessage(msg$,red=255,green=255,blue=255) message.Tmessage=New Tmessage message\message$=msg$ message\red=red:message\green=green:message\blue=blue End Function Ich weiss, der Code ist kacke aber eigentlich war er mal als Netzwerk test gedacht und wenn dieses Problem nicht aufgetreten wär hätte ich schon alles in handliche Funktionen gepackt.... naja kommt wenn ich diesen Fehler los bin! MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group