Below is some test code for a small multi-user program I am developing; but I have a problem... If the server closes with clients attached; I do not seem to be able to detect it until I exit the application.
Run this twice on your local system (Load Blitzmax twice), and click on Server on one, and Client on the other.
You can start and stop (ESC) the client (When the server is running), and the server detects this, but stop the server and the client does not notice...
Am I closing the Socket correctly in the Server code?
multiuser.bmx
SuperStrict
Const GS_MODE% = 0
Const GS_CLIENT% = 1
Const GS_SERVER% = 2
Const SERVER_ADDRESS$ = "127.0.0.1"
Const SERVER_PORT% = 31245
Graphics 320 , 200
Global gw% = GraphicsWidth()
Global th% = TextHeight( "A" )
Global state% = GS_MODE
Global quit% = False
'#
Global Server:TSocket
Global Client:TSocket
Global Clients:Tlist = CreateList()
'############################################################
Repeat
Delay(10)
Cls
Select state
'--------------------
Case GS_MODE
SetColor( 255,255,0 )
centerText( "CLIENT" , 0 , 50 , GW/2 )
centerText( "SERVER" , GW/2 , 50 , GW/2)
centerText( "Press ESC to Exit" , 0 , 150 , GW)
DrawLine( gw/2,0,gw/2,GraphicsHeight() )
If KeyHit( KEY_ESCAPE ) Then quit = True
If MouseHit(1) Then
If MouseX() < gw / 2 Then
client = createClient( SERVER_ADDRESS , SERVER_PORT )
If client Then
Print "#CLIENT CONNECTED"
state = GS_CLIENT
Else
Print "** ERROR CONNECTING TO SERVER"
End If
Else
server = createServer( SERVER_PORT )
If server Then
Print "#SERVER STARTED"
state = GS_SERVER
Else
Print "** ERROR STARTING SERVER"
End If
End If
End If
'--------------------
Case GS_CLIENT
centerText( "CLIENT" , 0 , TH , GW )
centerText( "Press ESC to Exit" , 0 , TH*2 , GW )
If KeyHit( KEY_ESCAPE ) Then
state = GS_MODE
CloseSocket( client )
Print "#CLIENT STOPPED"
Else
'# Check server still connected
'##### THIS DOES NOT APPEAR TO WORK #####
If Not SocketConnected(client) Then
Print "<Server connection lost"
state = GS_MODE
CloseSocket( client )
End If
End If
'--------------------
Case GS_SERVER
Local conn:TSocket
centerText( "SERVER" , 0 , TH , GW )
centerText( "Press ESC to Exit" , 0 , TH*2 , GW )
'# Are we closing the server?
If KeyHit( KEY_ESCAPE ) Then
state = GS_MODE
CloseSocket( server )
Print "#SERVER STOPPED"
Else
'# Check for NEW connections
conn = AcceptClient( server )
If conn Then
Print ">Client Connected from " + DottedIP(SocketRemoteIP(conn))
clients.addlast( conn )
End If
'# Check connections
For client = EachIn clients
If Not SocketConnected(client) Then
Print "<Client disconnected"
clients.remove( client )
CloseSocket( client )
End If
Next
End If
End Select
Flip
Until quit
'############################################################
Function centerText( txt$, x%, y%, w% )
DrawText( txt$ , x+( w-TextWidth(txt$)) / 2 , y )
End Function
'############################################################
Function CreateServer:TSocket(port:Int)
Local server:TSocket = New TSocket
server = CreateTCPSocket()
If Not BindSocket(server, port) Or Not SocketListen(server) Then
CloseSocket(server)
Return Null
EndIf
Return server
EndFunction
'############################################################
Function CreateClient:TSocket(address:String, port:Int)
Local client:TSocket = New TSocket
client = CreateTCPSocket()
If Not ConnectSocket(client, HostIp(address), port)
CloseSocket(client)
Return Null
EndIf
Return client
EndFunction
'############################################################
Function AcceptClient:TSocket(server:TSocket)
Local accepted_socket:TSocket = SocketAccept(server)
Local client:TSocket
If Not accepted_socket Return Null
client = New Tsocket
client = accepted_socket
Return client
EndFunction
|