Hi guys to those who are planning to make their own proxy and want to have a socket wrapper which is similar to classic winsock then this class below is the one you are looking.
I created a multi threading socket of System.Net.Sockets. I also created the events similar to classic winsock such as OnConnectionRequest, OnDisconnection, OnConnect, OnDataArrival, OnSendComplete and OnError.
Implementation: I am using a simple client server application using the mysocket class.
I created a multi threading socket of System.Net.Sockets. I also created the events similar to classic winsock such as OnConnectionRequest, OnDisconnection, OnConnect, OnDataArrival, OnSendComplete and OnError.
Code:
Imports System.Net.Sockets
Imports System.Net
Imports System.Text
Imports System.Threading
Public Class mysocket
Private _listener As Socket
Private listenThread As Thread
Private client As Socket
Private readThread As Thread
Private connectThread As Thread
Private sendThread As Thread
Private _localport As Integer
Private _remoteport As Integer
Private _remoteIP As String
Private data() As Byte
Private Const ByteSize As Integer = 1024
Private _Status As Integer
Public ReadOnly Property Status()
Get
Return _Status
End Get
End Property
Public Event OnConnectionRequest(ByVal client As Socket)
Public Event OnDisconnection()
Public Event OnConnect()
Public Event OnDataArrival(ByVal bytesize As Integer)
Public Event OnSendComplete(ByVal bytessent As Integer)
Public Event OnError(ByVal errmsg As String)
Public Sub New()
ReDim data(ByteSize - 1)
_Status = 0
End Sub
Public Property LocalPort() As Integer
Get
Return Me._localport
End Get
Set(ByVal value As Integer)
Me._localport = value
End Set
End Property
Public Property RemotePort() As Integer
Get
Return Me._remoteport
End Get
Set(ByVal value As Integer)
Me._remoteport = value
End Set
End Property
Public Property RemoteIP() As String
Get
Return Me._remoteIP
End Get
Set(ByVal value As String)
Me._remoteIP = value
End Set
End Property
Public Sub Listen()
Try
_listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim IEP As IPEndPoint = New IPEndPoint(IPAddress.Any, Me._localport)
_listener.Bind(IEP)
_listener.Listen(100)
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
_listener.BeginAccept(New AsyncCallback(AddressOf WaitConnections), _listener)
listenThread = New Thread(AddressOf WaitConnections)
listenThread.IsBackground = True
listenThread.Start()
End Sub
Private Sub WaitConnections(ByVal iar As IAsyncResult)
Try
Dim tmpsoc As Socket = DirectCast(iar.AsyncState, Socket)
Dim mclient As Socket = tmpsoc.EndAccept(iar)
RaiseEvent OnConnectionRequest(mclient)
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
Try
Me._listener.BeginAccept(New AsyncCallback(AddressOf WaitConnections), _listener)
Return
Catch ex1 As Exception
RaiseEvent OnError(ex1.ToString)
End Try
End Try
Try
Me._listener.BeginAccept(New AsyncCallback(AddressOf WaitConnections), _listener)
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Public Sub Accept(ByVal newclient As Socket)
Try
Me.client = newclient
Me.client.BeginReceive(data, 0, ByteSize, SocketFlags.None, New AsyncCallback(AddressOf ReceiveData), Me.client)
readThread = New Thread(AddressOf ReceiveData)
readThread.IsBackground = True
readThread.Start()
_Status = 1 ' Connected
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Private Sub ReceiveData(ByVal iar As IAsyncResult)
Try
Try
Me.client = DirectCast(iar.AsyncState, Socket)
Dim SE As SocketError = New SocketError
If Me.client.Connected Then
Dim datalen As Integer = Me.client.EndReceive(iar, SE)
If SE = SocketError.Success And datalen <> 0 Then
RaiseEvent OnDataArrival(datalen)
Me.client.BeginReceive(data, 0, ByteSize, SocketFlags.None, New AsyncCallback(AddressOf ReceiveData), Me.client)
Else
_Status = 0 ' Disconnected
RaiseEvent OnDisconnection()
End If
Else
_Status = 0 ' Disconnected
RaiseEvent OnDisconnection()
End If
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Public Sub GetData(ByRef buffer() As Byte, ByVal bytestotal As Integer)
ReDim buffer(bytestotal - 1)
System.Buffer.BlockCopy(Me.data, 0, buffer, 0, bytestotal)
End Sub
'' Client
Public Sub Connect()
Me.client = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim iep As New IPEndPoint(IPAddress.Parse(Me._remoteIP), Me._remoteport)
client.BeginConnect(iep, New AsyncCallback(AddressOf Connected), client)
connectThread = New Thread(AddressOf Connected)
connectThread.IsBackground = True
connectThread.Start()
End Sub
Private Sub Connected(ByVal iar As IAsyncResult)
Try
Me.client = DirectCast(iar.AsyncState, Socket)
Me.client.EndConnect(iar)
client.BeginReceive(data, 0, ByteSize, SocketFlags.None, New AsyncCallback(AddressOf ReceiveData), client)
_Status = 1 ' Connected
RaiseEvent OnConnect()
readThread = New Thread(AddressOf ReceiveData)
readThread.IsBackground = True
readThread.Start()
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Public Sub SendData(ByVal buffer() As Byte)
Try
If client.Connected Then
Me.client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf SendComplete), Me.client)
sendThread = New Thread(AddressOf SendComplete)
sendThread.IsBackground = True
sendThread.Start()
Else
End If
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Private Sub SendComplete(ByVal iar As IAsyncResult)
Dim sent As Integer = 0
Try
Dim remote As Socket = DirectCast(iar.AsyncState, Socket)
sent = remote.EndSend(iar)
RaiseEvent OnSendComplete(sent)
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Public Sub Close()
Try
Me.client.Close()
RaiseEvent OnDisconnection()
_Status = 0 ' Disconnected
Try
listenThread.Abort()
readThread.Abort()
connectThread.Abort()
sendThread.Abort()
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
Public Sub StopListen()
Try
Me._listener.Close()
RaiseEvent OnDisconnection()
_Status = 0 ' Disconnected
Try
listenThread.Abort()
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
Catch ex As Exception
RaiseEvent OnError(ex.ToString)
End Try
End Sub
End Class
Implementation: I am using a simple client server application using the mysocket class.
Code:
Imports System.Text
Public Class Form1
Private WithEvents myserver As mysocket = New mysocket
Private WithEvents myclient As mysocket = New mysocket
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
myserver.LocalPort = 43001
myserver.Listen()
End Sub
Private Sub OnConnectionRequest(ByVal client As System.Net.Sockets.Socket) Handles myserver.OnConnectionRequest
myclient.Accept(client)
End Sub
Private Sub OnDataArrival(ByVal bytesize As Integer) Handles myclient.OnDataArrival
Dim buffer() As Byte = {}
myclient.GetData(buffer, bytesize)
MsgBox("From client=>" & Encoding.ASCII.GetString(buffer))
End Sub
Private Sub OnDisconnect() Handles myclient.OnDisconnection
MsgBox("client was disconnected !!!")
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If myclient.Status = 1 Then
myclient.SendData(Encoding.ASCII.GetBytes(Me.TextBox1.Text))
End If
End Sub
Private Sub SendCompete(ByVal bytessent As Integer) Handles myclient.OnSendComplete
MsgBox("Send complete from server=> " & bytessent)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
myclient.Close()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
myserver.StopListen()
End Sub
End Class