Dakovalev1 писал(а):В гугле не нашёл.
HttpListener^ ls = gcnew HttpListener();
ls->Prefixes->Add(L"http://127.0.0.1:8888/");
ls->Start();
HttpListenerContext^con = ls->GetContext();
HttpListenerRequest^r = con->Request;
//здесь надо что-то такое сделать
ls->Stop();
ls->Close();
Dakovalev1 писал(а):Я создаю httplistener (нормальный)
Dakovalev1 писал(а):Оно и понятно. Httplistener сожрал запросы браузера и ответы не вернул.
Бааааммм внимание вопрос: как вернуть браузеру тот самый response.
public static void SimpleListenerExample(string[] prefixes)
{
if (!HttpListener.IsSupported)
{
Console.WriteLine ("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
return;
}
// URI prefixes are required,
// for example "http://contoso.com:8080/index/".
if (prefixes == null || prefixes.Length == 0)
throw new ArgumentException("prefixes");
// Create a listener.
HttpListener listener = new HttpListener();
// Add the prefixes.
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
Console.WriteLine("Listening...");
// Note: The GetContext method blocks while waiting for a request.
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// You must close the output stream.
output.Close();
listener.Stop();
}
Dakovalev1 писал(а):фрагмент моего кода (к сожалению managed c++)
Dakovalev1 писал(а):К сожалению потому, что форум всё-таки VBstreets а не c++/c#streets.
Dakovalev1 писал(а):Я кагбы всё это видел. Я клоню к тому, что в httplistenerrequest нет функции getresponse. Вообще-то геморойно. Вот и геморой получается..
Но загвоздка в том, что HttpWebRequest не переводиться в HttpListenerRequest легко, читай стандартными средствами.
Можно, конечно, сделать так:
- Код: Выделить всё
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(request.Url);
webRequest.ContentLength = request.ContentLength64;
webRequest.ContentType = request.ContentType;
webRequest.CookieContainer.Add(request.Cookies);
// ...........
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
// И наоборот
Но как-то это кривовато. Может я чето-нить забуду перевести (поля-то у них отличаются), может что-то перевести совсем нельзя.
Вопрос:
Как правильно перевести HttpWebRequest в HttpListenerRequest?
И аналогично с Response.
Тогда логичнее было бы спросить в другом разделе или форуме, если ты пишешь на С++
Dakovalev1 писал(а):Ёлки палки.
Неужели так сложно помочь?
Dakovalev1 писал(а):В гугле не нашёл.
Dakovalev1 писал(а):Вот чувак.
Dakovalev1 писал(а):У него такие же проблемы(были во всяком случае).
ivashkanet писал(а):ИМХО, эти классы не предназначены для написания прокси. Вот отправить запрос в инет и получить ответ --- запросто, а для прокси лучше использовать сокеты.
Вопрос:
Как правильно перевести HttpWebRequest в HttpListenerRequest?
И аналогично с Response. = Как выбранный мной класс (HttpListenerRequest) заставить перевестись в httpwebrequest
ProxyRequest.Method = Context.Request.HttpMethod;
ProxyRequest.UserAgent = Context.Request.UserAgent;
CookieContainer ProxyCookieContainer = new CookieContainer();
ProxyRequest.CookieContainer = new CookieContainer();
ProxyRequest.CookieContainer.Add(
ProxyCookieContainer.GetCookies(new Uri(ServerURL)));
ProxyRequest.KeepAlive = true;
Dakovalev1 писал(а):Вопрос:
Как правильно перевести HttpWebRequest в HttpListenerRequest?
И аналогично с Response. = Как выбранный мной класс (HttpListenerRequest) заставить перевестись в httpwebrequest
Ответ - никак?
Dakovalev1 писал(а):И что вот этих свойств достаточно(их тут всего 3 штуки).
Велика вероятность что-то упустить.
Раз ты не нашёл, то наверное с таким подходом/знаниями нада начать с азов: http://ru.wikipedia.org/wiki/HTTP
Dakovalev1 писал(а):кстати здесь %20 - пробел?
TcpListener^ proxy = gcnew TcpListener(8888);
proxy->Start();
Socket^ s = proxy->AcceptSocket();
array<Byte>^ buf = gcnew array<Byte>(1024);
int bytes = s->Receive(buf,1024,(SocketFlags)0);
String^ str= Encoding::ASCII->GetString(buf);
proxy->Stop();
Console::WriteLine(str);
String^ url = "";
int n1 = str->IndexOf(L" "),n2 = str->IndexOf(L" ",n1+1);
url = str->Substring(n1+1,n2-n1-1);
HttpWebRequest^req = (HttpWebRequest^)HttpWebRequest::Create(url);
HttpWebResponse^res = (HttpWebResponse^)req->GetResponse();//ошибка здесь не получается подключиться к серверу
Stream ^stream = res->GetResponseStream();
bytes = stream->Read(buf,0,32);
int bytessent = 0;
StringBuilder^sb = gcnew StringBuilder("");
while(bytes!=0)
{
sb->Append(Encoding::ASCII->GetString(buf,0,bytes));
s->Send(buf,bytes,(SocketFlags)0);
bytessent+=bytes;
bytes = stream->Read(buf,0,32);
}
Dakovalev1 писал(а):Но когда я получаю от браузера запрос, перенаправить его дальше в интернет не могу, потому, что подключение всё ещё настроено на прокси. И что получается замкнутый круг?
Как это исправить?
TcpListener^ proxy = gcnew TcpListener(8888);
proxy->Start();
Socket^ inet;
Socket^ s;
while(true)
{
s = proxy->AcceptSocket();
array<Byte>^ buf = gcnew array<Byte>(1024);
int bytes = s->Receive(buf,1024,(SocketFlags)0);
String^ str= Encoding::GetEncoding(1251)->GetString(buf);
Console::WriteLine(str);
String^ url = "";
int n1 = str->IndexOf(L" "),n2 = str->IndexOf(L" ",n1+1);
url = str->Substring(n1+1,n2-n1-1);
IPHostEntry^ host=Dns::GetHostByName(L"www.google.ru");
IPEndPoint^endpoint = gcnew IPEndPoint(host->AddressList[0],80);
inet = gcnew Socket(AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
inet->Connect(endpoint);
inet->Send(buf);
inet->Receive(buf);
while(true)
{
try
{
str= Encoding::GetEncoding(1251)->GetString(buf);
s->Send(buf);
inet->Receive(buf);
}
catch(SocketException^ ex)
{
break;
}
//Console::WriteLine(str);
}
Console::WriteLine("1");
}
inet->Shutdown(SocketShutdown::Both);
inet->Close();
IPHostEntry^ host=Dns::GetHostByName(L"www.google.ru");
IPEndPoint^endpoint = gcnew IPEndPoint(host->AddressList[0],80);
inet = gcnew Socket(AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5