Files
2026-08-27 11:22:34 -06:00

157 lines
5.3 KiB
VB.net

Imports System.IO
Imports System.Net.Sockets
Public Class Client
Public ClientSocket As Socket = Nothing
Public IsConnected As Boolean = False
Public BufferLength As Long = Nothing
Public BufferLengthReceived As Boolean = False
Public Buffer() As Byte = Nothing
Public MS As MemoryStream = Nothing
Public IP As String = Nothing
Public LV As ListViewItem = Nothing
Public SendSync As Object = Nothing
Public ID As String = Nothing
Sub New(ByVal CL As Socket)
ClientSocket = CL
ClientSocket.ReceiveBufferSize = 50 * 1024
ClientSocket.SendBufferSize = 50 * 1024
IsConnected = True
BufferLength = -1
Buffer = New Byte(0) {}
MS = New MemoryStream
IP = CL.RemoteEndPoint.ToString
SendSync = New Object()
If SettingsHelper.Blocked.Contains(IP.Split(":")(0)) Then
isDisconnected()
Return
Else
ClientSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf BeginReceive), Nothing)
End If
End Sub
Async Sub BeginReceive(ByVal ar As IAsyncResult)
If Not IsConnected OrElse Not ClientSocket.Connected Then
isDisconnected()
Return
End If
Try
Dim Received As Integer = ClientSocket.EndReceive(ar)
If Received > 0 Then
If BufferLength = -1 Then
If Buffer(0) = 0 Then
BufferLength = BS(MS.ToArray)
MS.Dispose()
MS = New MemoryStream
If BufferLength = 0 Then
BufferLength = -1
ClientSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf BeginReceive), ClientSocket)
End If
Buffer = New Byte(BufferLength - 1) {}
Else
Await MS.WriteAsync(Buffer, 0, Buffer.Length)
End If
Else
Await MS.WriteAsync(Buffer, 0, Received)
If (MS.Length = BufferLength) Then
Dim Read As New Messages
Read.Read(Me, MS.ToArray)
SettingsHelper.Received += MS.Length
BufferLength = -1
MS.Dispose()
MS = New MemoryStream
Buffer = New Byte(0) {}
Else
Buffer = New Byte(BufferLength - MS.Length - 1) {}
End If
End If
Else
isDisconnected()
Return
End If
ClientSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf BeginReceive), ClientSocket)
Catch ex As Exception
Debug.WriteLine("BeginReceive " & ex.Message)
isDisconnected()
Return
End Try
End Sub
Async Sub BeginSend(ByVal Data As Byte())
SyncLock SendSync
If Not IsConnected OrElse Not ClientSocket.Connected Then
isDisconnected()
Exit Sub
End If
Try
Using MS As New MemoryStream
Dim b As Byte() = AES_Encryptor(Data)
Dim L As Byte() = SB(b.Length & CChar(vbNullChar))
MS.Write(L, 0, L.Length)
MS.Write(b, 0, b.Length)
ClientSocket.Poll(-1, SelectMode.SelectWrite)
ClientSocket.BeginSend(MS.ToArray, 0, MS.Length, SocketFlags.None, New AsyncCallback(AddressOf EndSend), Nothing)
SettingsHelper.Sent += MS.Length
End Using
Catch ex As Exception
Debug.WriteLine("BeginSend " & ex.Message)
isDisconnected()
End Try
End SyncLock
End Sub
Sub EndSend(ByVal ar As IAsyncResult)
Try
ClientSocket.EndSend(ar)
Catch ex As Exception
Debug.WriteLine("EndSend " & ex.Message)
isDisconnected()
End Try
End Sub
Delegate Sub _isDisconnected()
Sub isDisconnected()
IsConnected = False
Try
If LV IsNot Nothing Then
If Messages.F.Lv1.InvokeRequired Then
Messages.F.Lv1.BeginInvoke(New _isDisconnected(AddressOf isDisconnected))
Exit Sub
Else
LV.Remove()
SettingsHelper.Online.Remove(Me)
LVLog(IP.Split(":")(0) & " Disconnected", Color.Red)
End If
End If
Catch ex As Exception
Debug.WriteLine("L.Remove " & ex.Message)
End Try
Try
ClientSocket.Close()
ClientSocket.Dispose()
Catch ex As Exception
Debug.WriteLine("C.Close " & ex.Message)
End Try
Try
MS.Dispose()
Catch ex As Exception
Debug.WriteLine("MS.Dispose " & ex.Message)
End Try
End Sub
End Class