Доброго времени суток, уважаемые форумчане. Нарисовалась задача написать прокси сервер для сети (машин 20), обычный Http прокси сервер, только вот не могу даже понять откуда начать:-( Заранее благодарю за помощь, C уважением, z0mbyak. P.S. Пишу на VB.NET из VS 2010
Если посмотреть немного ниже http://forum.antichat.net/thread256549.html Я почти все сделал только ответ от сервера криво приходит Правд на C# но там недалеко
VB для таких целей - это самое ][еровое Лучше уже на сишке или на другом любом нормальном языке. Даже от C# больше толку тут чем от VB. Вообще всё очень просто. Если абсолютно ноль, то лучше в делфи компонентик на форму кинь и будет готово. На си обычный HTTP прокси выходит гдето в 2-3 килобайт исполняемый файл. И примерно строк в 400 кода отслилы, если делать все проверки Идея всё проста (главное выбрать модель работы с сокетами), но основа такова: - подрубился чел - ты считываешь данные пока не встретишь \r\n - как встретил \r\n так значит первая строка считалась - из первой строки выбираешь IP и порт куда коннектится. - делаешь коннект куда надо. - если не сконнектился то говоришь типа bad gateway и закрываешь коннект - если сконнектился, то правишь первую строку (удаляешь адерс и порт запроса) - затем начинаешь передаешь её серваку - далее начинаешь обмен данными между серваком и клиентов. - как тока дисконнект у когото, так рви все коннекты. Главное не забыть про Connection: Keep-Alive или ставить на Close на лету. или же придется фиксировать факт второго запроса и там уже парсить занового HTTP заголовок
2 noxjoker: Спасибо, почитаю, может даже разберусь 2 slesh: Да я в курсе, что VB для этих целей не очень, но я ток на нем и умею кодить на VB 6.0 и VB.NET (переучиваюсь с VB 6), как бы не хотелось изучать тот же C# только для написания диплома... Нашел сорс, только он работает очень медленно и криво, подскажите что не так (пока про keep-Alive речи даже не идет) Code: 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() '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