Problem mit Readbyte(TCP)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

5k41

Betreff: Problem mit Readbyte(TCP)

BeitragDi, Apr 04, 2006 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 04, 2006 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

5k41

BeitragDi, Apr 04, 2006 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 06, 2006 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

;Print

 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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group