-
July 3rd, 2013, 08:07 PM
#1
Chat Server Crashing
Hello everyone, I am new here.
I am currently having an issue with a Login server I am trying to make. Its a basic Multithreaded TCP server and it does work, but after some time (couple of hours to about 2 days) the server randomly stops accepting new connections. The server works like this: the main thread listens for incoming connections, after somebody connects it starts a new thread for them, which then connects to the MySQL database and checks if their username/password is correct.
During some parts of the day this server might receive about 1000 login requests an hour, it was working fine for most part in the past when it was only 50-100 an hour.
Code:
Imports MySql.Data.MySqlClient
Imports System.Net.Sockets
Imports System.IO
Imports System.Net
Imports System
Imports System.Security
Imports System.Security.Cryptography
Imports System.Runtime.InteropServices
Imports System.Text.RegularExpressions
Imports System.Text
Module Module1
Private server As TcpListener
Private client As New TcpClient
Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 2081)
Private list As New List(Of Connection)
Private onlineuserlist As New List(Of String)
Public AllConnections As Integer = 0
Private Structure Connection
Dim stream As NetworkStream
Dim streamw As StreamWriter
Dim streamr As StreamReader
Dim nick As String
End Structure
Sub Main()
Try
Console.WriteLine("Server Started!")
server = New TcpListener(ipendpoint)
server.Start()
While True
Console.WriteLine("Waiting for a new client!")
Try
client = server.AcceptTcpClient
Catch ex As Exception
Console.WriteLine("Exception 101: " & ex.ToString)
End Try
Console.WriteLine("New Client Attempting to connect!")
Try
Dim c As New Connection
c.stream = client.GetStream
c.streamr = New StreamReader(c.stream)
c.streamw = New StreamWriter(c.stream)
c.nick = c.streamr.ReadLine
Console.WriteLine(c.nick & " is attempting to log in!")
list.Add(c)
Console.WriteLine("Current Connection Count: " & list.Count.ToString)
Dim t As New Threading.Thread(AddressOf ListenToConnection)
t.Start(c)
Console.WriteLine("Connection Thread Started!")
AllConnections += 1
Console.WriteLine("All Connections Count: " & AllConnections)
Catch ex As Exception
Console.WriteLine("Exception 102: " & ex.ToString)
End Try
End While
Catch ex As Exception
Console.WriteLine("Exception 103: " & ex.ToString)
End Try
End Sub
Private Sub ListenToConnection(ByVal con As Connection)
Try
Dim conn As New MySqlConnection
conn.ConnectionString = "server=127.0.0.1;Port=3306; user id=id; password=pass; database=db"
Do
Try
Dim tmp As String = con.streamr.ReadLine
Console.WriteLine("Thread Online!")
Dim sParts() As String
sParts = Split(tmp, "/\/\")
If sParts(0) = "Login" Then
Try
conn.Open()
Dim myAdapter As New MySqlDataAdapter
Dim sqlquery As String
Dim myCommand As New MySqlCommand
Dim Mydata As MySqlDataReader
sqlquery = "Select * From account WHERE Username='" & sParts(1) & "'AND Password='" & sParts(2) & "';"
myCommand.Connection = conn
myCommand.CommandText = sqlquery
myAdapter.SelectCommand = myCommand
Mydata = myCommand.ExecuteReader
Mydata.Read()
If Mydata.HasRows = True Then
If Mydata.GetString("Ban") <> "1" Then
con.streamw.WriteLine(Encrypt("LoginVerified/\/\" & Mydata.GetString("Username") & "/\/\" & Mydata.GetString("Rank") & "/\/\" & Mydata.GetString("WP") & "/\/\" & Mydata.GetString("Team") & "/\/\" & Mydata.GetString("Rating") & "/\/\" & Mydata.GetString("Gold") & "/\/\" & Mydata.GetString("Win") & "/\/\" & Mydata.GetString("Draw") & "/\/\" & Mydata.GetString("Lost")))
con.streamw.Flush()
Dim PlayerTeam As String = Mydata.GetString("Team")
Dim PlayerUsername As String = Mydata.GetString("Username")
Try
If Mydata.GetString("Friends") <> "" Then
Dim fParts() As String
fParts = Split(Mydata.GetString("Friends"), "+/|")
For Each FriendPlayer As String In fParts
For Each c As Connection In list
c.streamw.WriteLine(Encrypt("AddFriend/\/\" & FriendPlayer))
c.streamw.Flush()
Next
Next
End If
If Mydata.GetString("Team") <> "" Then
conn.Close()
Try
conn.Open()
Catch
End Try
sqlquery = "SELECT * FROM teams WHERE Name = '" & PlayerTeam & "'"
myCommand.Connection = conn
myCommand.CommandText = sqlquery
myAdapter.SelectCommand = myCommand
Mydata = myCommand.ExecuteReader
Mydata.Read()
If Mydata.HasRows <> 0 Then
con.streamw.WriteLine(Encrypt("SendTeam/\/\" & PlayerUsername & "/\/\" & Mydata.GetString("Leader")))
con.streamw.Flush()
If Mydata.GetString("Members") <> "" Then
Dim hParts() As String
hParts = Split(Mydata.GetString("Members"), "+/|")
For Each TeamPlayer As String In hParts
con.streamw.WriteLine(Encrypt("AddTeam/\/\" & TeamPlayer))
con.streamw.Flush()
Next
End If
End If
End If
conn.Close()
Catch
End Try
conn.Close()
con.streamw.WriteLine(Encrypt("ConnectToChatServer/\/\" & con.nick))
con.streamw.Flush()
Try
conn.Close()
conn.Open()
sqlquery = "UPDATE account SET CPUID = '" & sParts(3) & "' WHERE username = '" & sParts(1) & "'"
myCommand.Connection = conn
myCommand.CommandText = sqlquery
myAdapter.SelectCommand = myCommand
Mydata = myCommand.ExecuteReader
conn.Close()
conn.Open()
sqlquery = "UPDATE account SET IP = '" & sParts(4) & "' WHERE username = '" & sParts(1) & "'"
myCommand.Connection = conn
myCommand.CommandText = sqlquery
myAdapter.SelectCommand = myCommand
Mydata = myCommand.ExecuteReader
conn.Close()
conn.Open()
sqlquery = "UPDATE account SET ComputerName = '" & sParts(5) & "' WHERE username = '" & sParts(1) & "'"
myCommand.Connection = conn
myCommand.CommandText = sqlquery
myAdapter.SelectCommand = myCommand
Mydata = myCommand.ExecuteReader
conn.Dispose()
Catch
conn.Dispose()
list.Remove(con)
Exit Do
End Try
conn.Dispose()
list.Remove(con)
Exit Do
Else
conn.Dispose()
list.Remove(con)
Exit Do
End If
Else
Try
con.streamw.WriteLine(Encrypt("WrongPassword/\/\" & sParts(1)))
con.streamw.Flush()
conn.Dispose()
list.Remove(con)
Exit Do
Catch
conn.Dispose()
list.Remove(con)
Exit Do
End Try
End If
conn.Dispose()
Catch
conn.Dispose()
End Try
ElseIf sParts(0) = "Register" Then
conn.Open()
Dim myAdapter As New MySqlDataAdapter
Dim sqlquery = "SELECT * FROM account WHERE username = '" & sParts(1) & "'"
Dim myCommand As New MySqlCommand()
myCommand.Connection = conn
myCommand.CommandText = sqlquery
myAdapter.SelectCommand = myCommand
Dim myData As MySqlDataReader
myData = myCommand.ExecuteReader
If myData.HasRows = 0 Then
conn.Close()
conn.Open()
Dim registerfinal As New MySqlDataAdapter
sqlquery = "INSERT INTO account (Username, Password, Ban, Referral) VALUES ('" & sParts(1) & "','" & sParts(2) & "','" & "0" & "','" & sParts(4) & "')"
myCommand.Connection = conn
myCommand.CommandText = sqlquery
registerfinal.SelectCommand = myCommand
myData = myCommand.ExecuteReader
Try
con.streamw.WriteLine(Encrypt("RegisterComplete/\/\" & sParts(1)))
con.streamw.Flush()
conn.Dispose()
list.Remove(con)
Exit Do
Catch
conn.Dispose()
list.Remove(con)
Exit Do
End Try
Else
Try
con.streamw.WriteLine(Encrypt("RegisterFail/\/\" & sParts(1)))
con.streamw.Flush()
conn.Dispose()
list.Remove(con)
Exit Do
Catch
conn.Dispose()
list.Remove(con)
Exit Do
End Try
End If
conn.Dispose()
Else
conn.Dispose()
list.Remove(con)
Exit Do
End If
Catch ex As Exception
conn.Dispose()
list.Remove(con)
Exit Do
End Try
Loop
Catch ex As Exception
Console.WriteLine("Exception 104: " & ex.ToString)
End Try
End Sub
Public Function Encrypt(ByVal plainText As String) As String
Try
Dim passPhrase As String = "g4gsdafc"
Dim saltValue As String = "sgaege3r"
Dim hashAlgorithm As String = "SHA1"
Dim passwordIterations As Integer = 2
Dim initVector As String = "@1B2c3D4e5F6g7H8"
Dim keySize As Integer = 256
Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes(initVector)
Dim saltValueBytes As Byte() = Encoding.ASCII.GetBytes(saltValue)
Dim plainTextBytes As Byte() = Encoding.UTF8.GetBytes(plainText)
Dim password As New PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations)
Dim keyBytes As Byte() = password.GetBytes(keySize \ 8)
Dim symmetricKey As New RijndaelManaged()
symmetricKey.Mode = CipherMode.CBC
Dim encryptor As ICryptoTransform = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)
Dim memoryStream As New MemoryStream()
Dim cryptoStream As New CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
cryptoStream.FlushFinalBlock()
Dim cipherTextBytes As Byte() = memoryStream.ToArray()
memoryStream.Close()
cryptoStream.Close()
Dim cipherText As String = Convert.ToBase64String(cipherTextBytes)
Return cipherText
Catch
Return "Error"
End Try
End Function
End Module
-
July 10th, 2013, 01:16 AM
#2
Re: Chat Server Crashing
Need more bandwidth on the server end, or a faster server. Look into HOSTING it somewhere. AZURE can handle a lot more than that.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|