[ad_1]
VB
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; ByteGet = 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) Dim i As Int32 = UBound(ByteGet) ReDim Preserve ByteGet(UBound(ByteGet) + rBytes + 1) For x As Long = 1 To rBytes ByteGet(i + x) = RecvBytes(x - 1) Next End While IPsocket.Shutdown(SocketShutdown.Both) IPsocket.Close() strRetPage = strRetPage + ASCII.GetString(ByteGet, 0, ByteGet.Length) clientSocket.Send(ByteGet, ByteGet.Length, 0) ' 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 Overloads Sub Main() Main(System.Environment.GetCommandLineArgs()) End Sub Overloads Shared Sub Main(ByVal args() As String) Const port As Integer = 8889 Dim tcplistener As New TcpListener(port) Console.WriteLine("Listening on port {0}", +port) tcplistener.Start() While True Dim socket As Socket = tcplistener.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
プロキシ サーバーに Firefox または IE を構成すると、問題なくヘッダーを受け取ります。
サンプル ヘッダー
www.google.com GET http://google.ca/ HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-gsarcade-launch, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, */* Accept-Language: en-us User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; InfoPath.2; .NET CLR 3.5.30729) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: google.ca Cookie: PREF=ID=2cc48986d0a30551:U=4583f9a4276fb2df:FF=0:TM=1297940975:LM=1297941095:S=k0i-eurczYyMJF2q; NID=44=t7EdDRwCJHYI-iYWLo4NeRJ3DtFmv7wZ4yeUmEdemRP7X83I-kRJd6Ah3uf2rw-et_c_H5zYDd7vJuApaX0vs2K_jz30l7uQZPfmTdOeTvKpi67lXrbkiTP2DIOKeYew
私の質問は、これをブラウザに送り返してページを表示するにはどうすればよいですか?
解決策 1
さて、接続時に新しいソケットを作成し、その新しいソケットをここで Webproxy2 に渡します。
VB
Dim socket As Socket = tcplistener.AcceptSocket() Dim webproxy As New WebProxy2(socket)
次に、webProxy2 でプライベート オブジェクト clientSocket に渡されます。 したがって、それをブラウザに送り返すには、それをバイト配列に変換して clientSocket.send(yourByteArray) を実行するだけです。
…そして、あなたはすでにそれを行っていることがわかります( clientSocket.Send(ByteGet, ByteGet.Length, 0) )。 ブラウザで何も得られない場合は、Web クライアントを作成して Google に接続し、応答の違いを確認できると思います。 おそらく、ブラウザに表示されない理由を確認できるでしょう。
お役に立てれば…
– ピート
解決策 2
完全なコードを見せてもらえますか?
[ad_2]
コメント