Fehler beim Beenden von TCP Server

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Wendigo

Betreff: Fehler beim Beenden von TCP Server

BeitragSo, Jun 01, 2008 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Comunity Smile
ich habe einen kleinen Chat geschieben, das heißt eigentlich kann nur der Client senden und der Server empfangen, aber egal...
halt nur ein kleines Testprogramm

Das Problem das ich habe besteht darin, dass der Server beim Beenden die Fehlermeldung "memory access violation" (bzw. "unknown runtime exception" wenn ich es durch den Debugger jage) ausspuckt und zwar nur wenn er vorher von einem Client eine Nachricht erhalten hat. Wurde Clientseitig kein Kontakt zum Server aufgenommen wird der Server ordnungsgemäß beendet.
Mir scheint das so als ob der Fehler durch einen noch offenen TCP-Stream oder Ähnliches verursacht wird, aber der sollte ja eigentlich mit "CloseTCPServer" gekappt werden.

Hier nochmal die Programme für den Server und Client (zum ausprobieren)

Server:
Code: [AUSKLAPPEN]
AppTitle "Server"

Graphics 300,200,0,2

SetBuffer BackBuffer()

;Konstanten
Const SPACE = 57
Const ESC = 1

;Variablen
Global ActualMessage$ = ""
Global strStream$
Global strClientStream$
Global svrGame

svrGame=CreateTCPServer(8080)

If svrGame<>0 Then
   Print "Server erfolgreich gestartet"
Else
   Print "Server konnte nicht gestartet werden"
   End
End If


;Timer zur Framebegrenzung
Global frametimer = CreateTimer(50)


Repeat
   
   WaitTimer(frametimer);Framebegrenzung
   
   strStream$ = AcceptTCPStream(svrGame)
   
   If strStream$ Then
      strClientStream$ = strStream$
      If (ReadAvail(strStream$)) Then
         ActualMessage$ = ReadLine$(strStream$)   
      EndIf
      
   Else
      If strClientStream$ Then
         If (ReadAvail(strClientStream$)) Then
            ActualMessage$ = ReadLine$(strClientStream$)   
         EndIf   
      EndIf
   EndIf
   
   Text 10,30,ActualMessage$
   
   If Not svrGame Then End
   
   Flip
   Cls
   
Until KeyHit(ESC)

;Server beenden
CloseTCPServer svrGame
svrGame = 0

Delay 2000
End


Client:
Code: [AUSKLAPPEN]
AppTitle "Client"

Graphics 300,200,0,2

;Konstanten
Const ENTER = 28
Const SPACE = 57
Const ESC = 1
Const BACKSPACE = 14

SetBuffer BackBuffer()

;Variablen
Global MyMessage$ = ""

;TCP-Verbindung aufnehmen
Global strmGame = OpenTCPStream("127.0.0.1",8080)


If strmGame<>0 Then
   Print "Client erfolgreich verbunden"
Else
   Print "Konnte keine Verbindung herstellen"
   WaitKey
   End
End If

;Timer zur Framebegrenzung
Global frametimer = CreateTimer(50)

Repeat
   
   WaitTimer(frametimer);Framebegrenzung
   
   ;Message über Tastatureingabe aufnehmen
   WriteMessage()
   
   ;bisher eingegebene Nachricht anzeigen
   ShowActualMessage()
   
   ;Message an Server senden
   SendMessage()   
   
   Flip
   Cls
Until KeyHit(ESC)


;TCP-Verbindung wieder kappen
CloseTCPStream strmGame
strmGame = 0
End


Function SendMessage()
   
   If KeyHit(ENTER) Then
      ;Nachricht an Server senden
      WriteLine strmGame,MyMessage$
      ;Die Nachricht zurücksetzen
      MyMessage$ = ""
      ;Ken Keyboardbuffer leeren
      FlushKeys
   EndIf
   
End Function

Function WriteMessage()
   Local letter$ = ""
   Local length_txt% = 0
   
   letter$ = Str(GetKey())
   
   If letter$ <> "0" Then
      MyMessage$ = MyMessage$ + Chr$(letter$)   
   EndIf
   
   ;Mit Backspace den geschriebenen Text zeichenweise löschen
   If KeyHit(BACKSPACE) Then
      ;ermitteln der textlänge
      length_txt% = Len(MyMessage$)
      ;text um ein zeichen von rechts aus kürzen
      MyMessage$ = RSet(MyMessage$,length_txt% - 1)
      ;Leerzeichen entfernen
      MyMessage$ = Trim(MyMessage$)
      
   EndIf
   
End Function


Function ShowActualMessage()
   
   Text 10,30,MyMessage$
   
End Function




(ich weis, das löschen des texts mit backspace ist falschrum ^^)
 

Shark

BeitragSo, Jun 01, 2008 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
HI Wendigo,
ich habe eben dein Programm getestet und bin zum folgenden Ergebnis gekommen.
Man bekommt keine Fehlermeldung, wenn noch kein Client angemeldet ist. Also hat das Problem etwas mit dem Client zu tun. So wenn du kein CloseTCPServer svrGame ausführst nach dem Beenden des Programmes, dann kommt es zu keiner Fehlermeldung. Ich kann mir das so erklären, dass du den TCP schließt, aber der Client noch darauf zugreifen will...
Falls du dennoch CloseTCPServer ausführen willst, dann musst du vorher dem Client eine Nachricht schicken, dass der Server sich jetzt schließen will und dann beendest du zuerst den Client und dann den Server Wink

Hm Wegen deinem Backspace Problem... da hätte ich eine Lösung für dich:
Wechsel die Function und dann musst du noch Global key einfügen in dein Programm... (vor die Hauptschleife natürlich) und dann musst du noch key = GetKey() in die Hauptschleife einsetzten und fertig Wink.
Falls du fragen hast wie das genau funktioniert, dann kannst du sie natürlich gerne stellen.
Code: [AUSKLAPPEN]

Function WriteMessage()
   If key >37 And  key <127 Then 
      MyMessage$ = MyMessage$ + Chr$(key)
   EndIf   
   
   ;Mit Backspace den geschriebenen Text zeichenweise löschen
   If KeyHit(BACKSPACE) And MyMessage$ <> "" Then
      MyMessage$ = Left(MyMessage$,Len(MyMessage$)-1)
   EndIf

End Function



mfg Shark
 

Wendigo

BeitragSo, Jun 01, 2008 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnelle Hilfe Shark Smile

leider kommt die Fehlermeldung aber auch wenn wenn ich den Client zu erst beende (hat ja "CloseTCPStream" am Ende des Programms).
Eigentlich dürfte er ja dann den Server ja gar nicht mehr ansprechen.

PS: Danke nochmal für die Hilfe bei der Stringbearbeitung Smile
 

Wendigo

BeitragFr, Jun 13, 2008 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
--Push--

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group