Fehler beim Beenden von TCP Server
Übersicht

WendigoBetreff: Fehler beim Beenden von TCP Server |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Comunity ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für die schnelle Hilfe Shark ![]() 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 ![]() |
||
Wendigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
--Push-- | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group