I have found an example of VB.Net console proxy, and have fixed a couple of
errors. But, it does not seem to pass through pictures and throws an error
that says "An existing connection was forcibly closed by the remote host".
The goal is to be able to filter the content on the way to the browser. Any
help you could give with this project would be appreciated.
The VB.Net 2005 code is as follows......
Imports System '
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Namespace WebProxy2
Class WebProxy2
Private clientSocket As Socket
Private read() As [Byte] = New Byte(1024) {}
Private Buffer As [Byte]() = Nothing
Private ASCII As Encoding = Encoding.ASCII
Private HTTP_VERSION As String = "HTTP/1.0"
Private CRLF As String = ControlChars.Cr + ControlChars.Lf
Private RecvBytes(4096) As [Byte]
Public Sub New(ByVal socket As Socket)
Me.clientSocket = socket
End Sub 'New
Public Sub run()
Dim clientmessage As [String] = " "
Dim sURL As [String] = " "
Dim bytes As Integer = readmessage(read, clientSocket,
clientmessage)
If bytes = 0 Then
Return
End If
Dim index1 As Integer = clientmessage.IndexOf(" "c)
Dim index2 As Integer = clientmessage.IndexOf(" "c, index1 + 1)
If index1 = -1 Or index2 = -1 Then
Throw New IOException()
End If
Console.WriteLine("Connecting to Site: {0}",
clientmessage.Substring(index1 + 1, index2 - index1))
Console.WriteLine("Connection from {0}",
clientSocket.RemoteEndPoint)
Dim part1 As String = clientmessage.Substring(index1 + 1,
index2 - index1)
Dim index3 As Integer = part1.IndexOf("/"c, index1 + 8)
Dim index4 As Integer = part1.IndexOf(" "c, index1 + 8)
Dim index5 As Integer = index4 - index3
sURL = part1.Substring(index1 + 4, part1.Length - index5 - 8)
Try
Dim IPHost As IPHostEntry = Dns.Resolve(sURL)
Console.WriteLine("Request resolved: ", IPHost.HostName)
Dim aliases As String() = IPHost.Aliases
Dim address As IPAddress() = IPHost.AddressList
Console.WriteLine(address(0))
Dim sEndpoint As New IPEndPoint(address(0), 80)
Dim IPsocket As New Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)
IPsocket.Connect(sEndpoint)
If IPsocket.Connected Then
Console.WriteLine("Socket connect OK")
End If
Dim [GET] As String = clientmessage
Dim ByteGet As [Byte]() = ASCII.GetBytes([GET])
IPsocket.Send(ByteGet, ByteGet.Length, 0)
Dim rBytes As Int32 = IPsocket.Receive(RecvBytes,
RecvBytes.Length, 0)
Console.WriteLine("Recieved {0}", +rBytes)
'Buffer = RecvBytes;
Dim strRetPage As [String] = Nothing
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0,
rBytes)
While rBytes > 0
rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length,
0)
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0,
rBytes)
End While
IPsocket.Shutdown(SocketShutdown.Both)
IPsocket.Close()
sendmessage(clientSocket, strRetPage)
Catch exc2 As Exception
Console.WriteLine(exc2.ToString())
End Try
End Sub 'run
Private Function readmessage(ByVal ByteArray() As Byte, ByRef s As
Socket, ByRef clientmessage As [String]) As Integer
Dim bytes As Integer = s.Receive(ByteArray, 1024, 0)
Dim messagefromclient As String =
Encoding.ASCII.GetString(ByteArray)
clientmessage = CType(messagefromclient, [String])
Return bytes
End Function 'readmessage
Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
Buffer = New [Byte](message.Length + 1) {}
Dim length As Integer = ASCII.GetBytes(message, 0,
message.Length, Buffer, 0)
s.Send(Buffer, length, 0)
End Sub 'sendmessage
'Entry point which delegates to C-style main Private Function
Public Overloads Shared Sub Main()
Main2(System.Environment.GetCommandLineArgs())
End Sub
Overloads Shared Sub Main2(ByVal args() As String)
Const port As Integer = 8889
'must set up local byte array for address type
Dim myIP(3) As Byte
myIP(0) = 127
myIP(1) = 0
myIP(2) = 0
myIP(3) = 1
Dim myLocalAddress As New System.Net.IPAddress(myIP)
'use byte array to open a listner
Dim tcplistener1 As New TcpListener(myLocalAddress, port)
'TcpListener(port)
Console.WriteLine("Listening on port {0}", +port)
tcplistener1.Start()
While True
Dim socket As Socket = tcplistener1.AcceptSocket()
Dim webproxy As New WebProxy2(socket)
Dim thread As New Thread(New ThreadStart(AddressOf
webproxy.run))
thread.Start()
End While
End Sub 'Main
End Class 'WebProxy2
End Namespace 'WebProxy2