C#代理在browserControl中工作,但在WebRequest中不工作

时间:2017-12-09 13:51:44

标签: c# proxy tor wininet

我尝试使用Tor下载文件。我发现代码有效,但它只是一个Windows窗体浏览器控件(= Internet Explorer),而我只是想下载一个文件。

我尝试使用WebRequest(当Tor正在运行时),但它只是永远加载:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.icanhazip.com/");
request.Proxy = new WebProxy("127.0.0.1", 8182);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    MessageBox.Show(new StreamReader(response.GetResponseStream()).ReadToEnd());
}

但我找到的代码使用相同的IP和端口进行浏览器控制。不幸的是,代理的代码更复杂:

// (uses wininet.dll)
IntPtr hInternet = InternetOpen(agentName, INTERNET_OPEN_TYPE_DIRECT, null, null, 0);

INTERNET_PER_CONN_OPTION[] options = new INTERNET_PER_CONN_OPTION[2];
options[0] = new INTERNET_PER_CONN_OPTION();
options[0].dwOption = (int)INTERNET_PER_CONN_OPTIONENUM.INTERNET_PER_CONN_FLAGS;
options[0].value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;

options[1] = new INTERNET_PER_CONN_OPTION();
options[1].dwOption = (int)INTERNET_PER_CONN_OPTIONENUM.INTERNET_PER_CONN_PROXY_SERVER;
options[1].value.pszValue = Marshal.StringToHGlobalAnsi("127.0.0.1:8182");

IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(options[0]) + Marshal.SizeOf(options[1]));
IntPtr current = buffer;

for (int i = 0; i < options.Length; i++)
{
    Marshal.StructureToPtr(options[i], current, false);
    current = (IntPtr)((int)current + Marshal.SizeOf(options[i]));
}

INTERNET_PER_CONN_OPTION_LIST optionList = new INTERNET_PER_CONN_OPTION_LIST();
optionList.pOptions = buffer;
optionList.Size = Marshal.SizeOf(optionList);
optionList.Connection = IntPtr.Zero;
optionList.OptionCount = options.Length;
optionList.OptionError = 0;

int size = Marshal.SizeOf(optionList);
IntPtr intPtrStruct = Marshal.AllocCoTaskMem(size);
Marshal.StructureToPtr(optionList, intPtrStruct, true);

bool bReturn = InternetSetOption(hInternet, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intPtrStruct, size);

Marshal.FreeCoTaskMem(buffer);
Marshal.FreeCoTaskMem(intPtrStruct);

InternetCloseHandle(hInternet);

这使用了一个库(Tor.NET),它可以使用tor作为代理。我在工作代码之后立即在同一个文件中编写了我的代码。

为什么这样做但我的WebRequest不起作用?有什么区别?

0 个答案:

没有答案