How I can add proxy/socks4/socks5 to C# Socket.
I need use it throw Socket. I don't want use WebRequest and any classes.
private static Socket ConnectSocket(string server, int port)
{
Socket s = null;
IPHostEntry hostEntry = null;
// Get host related information.
hostEntry = Dns.GetHostEntry(server);
// Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
// an exception that occurs when the host IP Address is not compatible with the address family
// (typical in the IPv6 case).
foreach (IPAddress address in hostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address, port);
Socket tempSocket =
new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if (tempSocket.Connected)
{
s = tempSocket;
break;
}
else
{
continue;
}
}
return s;
}
public static string SocketQuery(string Url, int Port, string Method = "GET", string Cookie = "", string DataFields = "")
{
string host = ExtractDomainAndPathFromURL(Url);
string request = Method.ToUpper() + " " + ExtractDomainAndPathFromURL(Url, 2) + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
((Cookie != String.Empty) ? "Cookie: " + Cookie + "\r\n" : "") +
((Method.ToUpper() == "POST") ? "Content-Length:" + DataFields.Length + "\r\n" : "") +
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Ge开发者_StackOverflow社区cko/20101203 Firefox/3.6.13\r\n" +
"Connection: Close\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"\r\n" +
((Method.ToUpper() == "POST") ? DataFields : "");
Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
Byte[] bytesReceived = new Byte[256];
Socket s = ConnectSocket(host, Port);
if (s == null)
return ("Connection failed");
s.Send(bytesSent, bytesSent.Length, 0);
int bytes = 0;
string page = String.Empty;
do
{
bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
page = page + Encoding.GetEncoding("UTF-8").GetString(bytesReceived, 0, bytes);
}
while (bytes > 0);
return page;
}
What will I add to this code?
Not quite sure why you say you don't want to use WebRequest
(or I imagine, WebClient
for that matter) when you are clearly creating an http web request, but I'll assume you have your reasons!
In short, there is no built in way of supporting SOCKS proxies in .Net, and there is not support for http proxies at the level as low as sockets (it wouldn't really make sense this low as there is no guarantee the requests are http requests). There is http proxy support built into .Net at the higher HttpWebRequest
/WebClient
layer - but you've already discounted this.
I think your options are:
- Use the correct tool for the job
(
HttpWebRequest
orWebClient
) and get http proxy support for free. - Use a third party implementation of SOCKS support, of which there appear to be a few if you do a Google search. (for example this one).
instead of opening a socket to the actual location, try to open the socket to the proxy.
精彩评论