Preventing crash on close stream

BlitzMax Forums/BlitzMax Programming/Preventing crash on close stream

ozak(Posted 2006) [#1]
I'm doing a webserver type app where people can download stuff using their webbrowser.

The problem is that the app crashes, if the downloader closes their connection.

It crashes in the following line:
clientStream.writeBytes(bytes , read)


As the clientStream is suddenly closed.
Wrapping it in try catch does nothing.
The app simply crashes as it attempts to write to the invalid stream.
No info in debug mode. It just ends.


Gabriel(Posted 2006) [#2]
Can you not detect the stream closing with Eof(clientStream) ?

EG:

If Not(clientStream.Eof())
   clientStream.writeBytes(bytes , read)
Else
   clientStream.Close()
   GoDoSomethingElse()
End If



ozak(Posted 2006) [#3]
No go. I can't prevent it from crashing.
The app icon in the taskbar disappears but the app keeps running.
(It's a console app)
I can quit it using Escape from inside the IDE console. Just like before the app crashes.


Dreamora(Posted 2006) [#4]
Isn't there a command to check if the stream is still alive? (don't know, perhaps even a =null check on the stream itself?)

If not, using BNetEx and readavail (like in old blitz) might be a solution so you see when the stream breaks.

Another not tested idea as this is an io thing: enclose it within try - catch. IO stuff etc throws errors.


AlexO(Posted 2006) [#5]
think there is an isConnected() or isSocketConnected() method somewhere in the socket docs.


Brendane(Posted 2006) [#6]
Is this on windows?

My socket streams on windows work fine. I use Eof() to determine whether the client/server disconnected. No problems so far.


ozak(Posted 2006) [#7]
It's on Mac. I'll test it on Windows tomorrow.


Brendane(Posted 2006) [#8]
Try this test server/client (compile both without gui app - these are meant for console). Press ctrl-c to disconnect on windows (end program)

Server:-
SuperStrict

Global serverSocket:TSocket = CreateTCPSocket()
serverSocket.Bind( 24010 )
serverSocket.Listen(0)

Global serverStream:TStream = CreateSocketStream( serverSocket )
Global clientList:TList = New TList

Function ServiceClients()
	For Local client:TSocketStream = EachIn clientList
		If Eof(client )
			Print "Client " + client.ToString() + " disconnected"
			client.close()
			clientList.Remove( client )
			client = Null
		Else
			If SocketReadAvail( client.Socket() )		
				Local line:String = client.ReadLine()
				If line
					Print "Msg from client " + client.ToString() + " :" + line
					client.WriteLine( line )
				EndIf
			EndIf
		EndIf
	Next
EndFunction

Print "Server running. Waiting for connections."
Repeat
	Local socket:TSocket = SocketAccept( serverSocket, 10 )
	If socket
		Local stream:TSocketStream = CreateSocketStream(socket)
		clientList.AddLast( stream )
		Print "Client " + stream.ToString() + " connected"
	EndIf
	
	ServiceClients()
Forever


Client:-
SuperStrict

Global stream:TStream

Print "Attempting to connect to server..."
Repeat
	If Not stream
		stream = TSocketStream.CreateClient( "localhost", 24010 )
		If stream 
			Print "Connected to server"
		EndIf
	Else
		If Eof( stream )
			Print "Server disconnected. Reconnecting..."
			stream.Close()
			stream = Null
		Else
			Local s:String = Input( "Msg to server :" )
			stream.WriteLine(s)
			Local line:String = stream.ReadLine()
			If line
				Print "Response from server :"+line
			EndIf
		EndIf
	EndIf	
Forever