' This demonstrates how to perform a graceful disconnect, where data sending/receiving ' is allowed to complete before the client is disconnected. ' In this demo the server begins the graceful disconnect process ' It is also possible for a client to initiate a graceful disconnect ' mnClientConnected return value constants Imports System.Threading Module Module1 Sub Main() Const C_NOT_CONNECTED As Integer = 0 Const C_CONNECTED As Integer = 1 Const C_NO_SEND As Integer = 2 Const C_NO_RECV As Integer = 3 Const C_NO_SEND_RECV As Integer = 4 ' Setup server Dim iReturn As Integer = 0 Console.WriteLine("DarkNet version: " + mn.GetVersion()) Dim RecvPacket As Int64 = mn.CreatePacket() Dim SendPacket As Int64 = mn.CreatePacket() mn.SetMemorySize(SendPacket, 1024) mn.SetUsedSize(SendPacket, 1024) mn.Start(1, 0) mn.DisableUDP(0) mn.SetLocal(0, "127.0.0.1", 6565, "", 0) mn.EnableGracefulDisconnect(0) ' Enable graceful disconnect mn.StartServer(0, 50, 0, 0) Console.WriteLine("Server started on TCP port " + mn.GetLocalPortTCP(0).ToString()) ' Send data to clients every SendFreq ms Dim SendTimer As Integer = 0 Dim SendFreq As Integer = 100 ' Disconnect a client every DisconnectFreq ms Dim DisconnectTimer As Integer = 0 Dim DisconnectFreq As Integer = 3000 ' Main loop Do ' Use less CPU Thread.Sleep(1) ' Graceful close For cl As Integer = 1 To mn.GetMaxClients(0) Dim iClientStatus As Integer = mn.ClientConnected(0, cl) Select Case (iClientStatus) ' Shutdown client ' Further send operations to this client will fail silently ' mn.ClientConnected will now return 2 Case (C_CONNECTED) If (System.DateTime.Now.Millisecond + (System.DateTime.Now.Second * 1000) + (System.DateTime.Now.Minute * 60 * 1000)) - DisconnectTimer > DisconnectFreq Then mn.ShutdownClient(0, cl) Console.WriteLine("Shut down client " + cl.ToString()) DisconnectTimer = System.DateTime.Now.Millisecond + (System.DateTime.Now.Second * 1000) + (System.DateTime.Now.Minute * 60 * 1000) End If ' Client is sending us data still ' We will wait forever, but a robust server should ' only wait for a set amount of time, and forcefully ' disconnect clients that take too long Case (C_NO_SEND) ' Nothing to do while we wait ' Client has finished sending us data ' We must get it from packet queue ' Once packet queue is empty, client ' will be disconnected by mn.ClientConnected ' and mn.ClientConnected will return 0 Case (C_NO_SEND_RECV) Console.WriteLine("mn.ClientConnected (" + cl.ToString() + "): " + iClientStatus.ToString()) While (mn.RecvTCP(0, RecvPacket, cl) > 0) Dim str As String = mn.GetString(RecvPacket, 0, True) Console.WriteLine("Final string received from client " + cl.ToString() + ": " + str) End While End Select Next cl ' New clients iReturn = mn.ClientJoined(0) If iReturn > 0 Then Console.WriteLine("New client joined, ID: " + iReturn.ToString()) DisconnectTimer = System.DateTime.Now.Millisecond + (System.DateTime.Now.Second * 1000) + (System.DateTime.Now.Minute * 60 * 1000) End If ' Leaving clients iReturn = mn.ClientLeft(0) If iReturn > 0 Then Console.WriteLine("Client left, ID: " + iReturn.ToString()) End If ' Receive data For cl As Integer = 1 To mn.GetMaxClients(0) If mn.ClientConnected(0, cl) = C_CONNECTED Then ' TCP packets iReturn = mn.RecvTCP(0, RecvPacket, cl) If (iReturn > 0) Then Dim str As String = mn.GetString(RecvPacket, 0, True) Console.WriteLine("String received from client " + cl.ToString() + ": " + str) End If End If Next cl ' Send data If (System.DateTime.Now.Millisecond + (System.DateTime.Now.Second * 1000) + (System.DateTime.Now.Minute * 60 * 1000)) - SendTimer > SendFreq Then For cl As Integer = 1 To mn.GetMaxClients(0) If (mn.ClientConnected(0, cl) = C_CONNECTED) Then mn.SendTCP(0, SendPacket, cl, True, True) Console.WriteLine("Packet sent") End If Next cl SendTimer = System.DateTime.Now.Millisecond + (System.DateTime.Now.Second * 1000) + (System.DateTime.Now.Minute * 60 * 1000) End If Loop End Sub End Module