[COLOR=BLUE]Imports[/COLOR] System
[COLOR=BLUE]Imports[/COLOR] System.Net
[COLOR=BLUE]Imports[/COLOR] System.Net.Sockets
[COLOR=BLUE]Imports[/COLOR] System.Text
[COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Class[/COLOR] StateObject
[COLOR=BLUE]Public[/COLOR] workSocket [COLOR=BLUE]As[/COLOR] Socket = [COLOR=BLUE]Nothing
[/COLOR] [COLOR=BLUE]Public[/COLOR] BufferSize [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR] = 32767
[COLOR=BLUE]Public[/COLOR] buffer(32767) [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte
[/COLOR] [COLOR=BLUE]Public[/COLOR] sb [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]New[/COLOR] StringBuilder()
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Class
Public[/COLOR] [COLOR=BLUE]Class[/COLOR] SocketsClient
[COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Event[/COLOR] onConnect()
[COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Event[/COLOR] onError([COLOR=BLUE]ByVal[/COLOR] Description [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]String[/COLOR])
[COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Event[/COLOR] onDataArrival([COLOR=BLUE]ByVal[/COLOR] Data [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte[/COLOR](), [COLOR=BLUE]ByVal[/COLOR] TotalBytes [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR])
[COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Event[/COLOR] onDisconnect()
[COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Event[/COLOR] onSendComplete([COLOR=BLUE]ByVal[/COLOR] DataSize [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR])
[COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Shared[/COLOR] response [COLOR=BLUE]As[/COLOR] [String] = [String].Empty
[COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Shared[/COLOR] port [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR] = 44
[COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Shared[/COLOR] ipHostInfo [COLOR=BLUE]As[/COLOR] IPHostEntry = Dns.Resolve("localhost")
[COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Shared[/COLOR] ipAddress [COLOR=BLUE]As[/COLOR] ipAddress = ipHostInfo.AddressList(0)
[COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Shared[/COLOR] client [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]New[/COLOR] Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
[COLOR=GREEN]'Private Shared RawClient As New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw)
[/COLOR] [COLOR=GREEN]'//raw socket^^
[/COLOR] [COLOR=GREEN]'/// ignore this.
[/COLOR] [COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Sub[/COLOR] Connect([COLOR=BLUE]ByVal[/COLOR] RemoteHostName [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]String[/COLOR], [COLOR=BLUE]ByVal[/COLOR] RemotePort [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR])
[COLOR=BLUE]Try
[/COLOR] [COLOR=GREEN]'RawClient = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw)
[/COLOR] client = [COLOR=BLUE]New[/COLOR] Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
port = RemotePort
ipHostInfo = Dns.Resolve(RemoteHostName)
ipAddress = ipHostInfo.AddressList(0)
[COLOR=BLUE]Dim[/COLOR] remoteEP [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]New[/COLOR] IPEndPoint(ipAddress, port)
client.BeginConnect(remoteEP, [COLOR=BLUE]AddressOf[/COLOR] sockConnected, client)
[COLOR=GREEN]'RawClient.BeginConnect(remoteEP, AddressOf sockConnected, RawClient)
[/COLOR] [COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError(Err.Description)
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Sub[/COLOR] SendData([COLOR=BLUE]ByVal[/COLOR] Data() [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte[/COLOR])
[COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]Dim[/COLOR] byteData [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte[/COLOR]() = Data
client.BeginSend(byteData, 0, byteData.Length, 0, [COLOR=BLUE]AddressOf[/COLOR] sockSendEnd, client)
[COLOR=GREEN]'RawClient.BeginSend(byteData, 0, byteData.Length, 0, AddressOf sockSendEnd, RawClient)
[/COLOR] [COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError(Err.Description)
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Sub[/COLOR] Disconnect()
[COLOR=BLUE]Try
[/COLOR] client.Shutdown(SocketShutdown.Both)
[COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] client.Close()
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Function[/COLOR] StringToBytes([COLOR=BLUE]ByVal[/COLOR] Data [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]String[/COLOR]) [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte[/COLOR]()
StringToBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(Data)
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Function
[/COLOR] [COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Function[/COLOR] BytestoString([COLOR=BLUE]ByVal[/COLOR] Data [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte[/COLOR]()) [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]String
[/COLOR] BytestoString = System.Text.ASCIIEncoding.ASCII.GetString(Data)
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Function
[/COLOR] [COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Sub[/COLOR] sockConnected([COLOR=BLUE]ByVal[/COLOR] ar [COLOR=BLUE]As[/COLOR] IAsyncResult)
[COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]If[/COLOR] client.Connected = [COLOR=BLUE]False[/COLOR] [COLOR=BLUE]Then[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError("Connection refused.") : [COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Dim[/COLOR] state [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]New[/COLOR] StateObject()
state.workSocket = client
client.BeginReceive(state.buffer, 0, state.BufferSize, 0, [COLOR=BLUE]AddressOf[/COLOR] sockDataArrival, state)
[COLOR=BLUE]RaiseEvent[/COLOR] onConnect()
[COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError(Err.Description)
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Sub[/COLOR] sockDataArrival([COLOR=BLUE]ByVal[/COLOR] ar [COLOR=BLUE]As[/COLOR] IAsyncResult)
[COLOR=BLUE]Dim[/COLOR] state [COLOR=BLUE]As[/COLOR] StateObject = [COLOR=BLUE]CType[/COLOR](ar.AsyncState, StateObject)
[COLOR=BLUE]Dim[/COLOR] client [COLOR=BLUE]As[/COLOR] Socket = state.workSocket
[COLOR=BLUE]Dim[/COLOR] bytesRead [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer
[/COLOR] [COLOR=BLUE]Try
[/COLOR] bytesRead = client.EndReceive(ar)
[COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]Dim[/COLOR] Data() [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Byte[/COLOR] = state.buffer
[COLOR=BLUE]If[/COLOR] bytesRead = 0 [COLOR=BLUE]Then
[/COLOR] client.Shutdown(SocketShutdown.Both)
client.Close()
[COLOR=BLUE]RaiseEvent[/COLOR] onDisconnect()
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]If
[/COLOR] [COLOR=BLUE]ReDim[/COLOR] state.buffer(32767)
client.BeginReceive(state.buffer, 0, state.BufferSize, 0, [COLOR=BLUE]AddressOf[/COLOR] sockDataArrival, state)
[COLOR=BLUE]RaiseEvent[/COLOR] onDataArrival(Data, bytesRead)
[COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError(Err.Description)
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Private[/COLOR] [COLOR=BLUE]Sub[/COLOR] sockSendEnd([COLOR=BLUE]ByVal[/COLOR] ar [COLOR=BLUE]As[/COLOR] IAsyncResult)
[COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]Dim[/COLOR] client [COLOR=BLUE]As[/COLOR] Socket = [COLOR=BLUE]CType[/COLOR](ar.AsyncState, Socket)
[COLOR=BLUE]Dim[/COLOR] bytesSent [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR] = client.EndSend(ar)
[COLOR=BLUE]RaiseEvent[/COLOR] onSendComplete(bytesSent)
[COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError(Err.Description)
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub
[/COLOR] [COLOR=BLUE]Public[/COLOR] [COLOR=BLUE]Function[/COLOR] Connected() [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Boolean
[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]Return[/COLOR] client.Connected
[COLOR=BLUE]Catch
[/COLOR] [COLOR=BLUE]RaiseEvent[/COLOR] onError(Err.Description)
[COLOR=BLUE]Exit[/COLOR] [COLOR=BLUE]Function
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Try
[/COLOR] [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Function
End[/COLOR] [COLOR=BLUE]Class
[/COLOR]