这篇文章主要介绍了c#使用Socket发送HTTP/HTTPS请求的实现代码,需要的朋友可以参考下
C# 自带的HttpWebRequest效率太低,对于自组HTTP封包不好操作。
在写超级SQL注入工具时,研究了很长一段时间如何使用Socket来发送HTTP、HTTPS请求。
经过一年的修改和测试,可完美、高效发送并解析HTTP/HTTPS请求。修改过无数次bug。
在这里把核心代码分享出来,供大家学习或做开发参考。
用这个代码写了一个简单的HTTP发包工具。供大家参考。
工具下载:
HTTPTool.rar
核心类:HTTP.cs
using System;
using System.Collections.Generic;
using System.Text;
using tools;
using System.Net;
using System.Net.Sockets;
using System.IO.Compression;
using System.IO;
using System.Net.Security;
using System.Text.RegularExpressions;
using System.Threading;
using System.Diagnostics;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using HTTPTool;
namespace tools
{
public class HTTP
{
public const char T = '
';
public const String CT = "
";
public const String CTRL = "
";
public const String Content_Length_Str = "content-length: ";
public const String Content_Length_Str_M = "Content-Length: ";
public const String Content_Length = "content-length";
public const String Content_Encoding = "content-encoding";
public const String Transfer_Encoding = "transfer-encoding";
public const String Connection = "connection";
public static Main main = null;
public static long index = 0;
public void initMain(Main m)
{
main = m;
}
/**
*
发生异常尝试重连
*
*/
public static ServerInfo sendRequestRetry(Boolean isSSL, int tryCount, String host, int port, String payload, String request, int timeout, String encoding, Boolean foward_302)
{
int count = 0;
Interlocked.Increment(ref index);
ServerInfo server = new ServerInfo();
timeout = timeout * 1000;
while (true)
{
if (count >= tryCount) break;
try
{
if (!isSSL)
{
server = sendHTTPRequest(count, host, port, payload, request, timeout, encoding, foward_302);
return server;
}
else
{
server = sendHTTPSRequest(count, host, port, payload, request, timeout, encoding, foward_302);
return server;
}
}
catch (Exception e)
{
Tools.SysLog("发包发生异常,正在重试----" + e.Message);
server.timeout = true;
continue;
}
finally
{
count++;
}
}
return server;
}
private static void checkContentLength(ref ServerInfo server, ref String request)
{
//重新计算并设置Content-length
int sindex = request.IndexOf(CTRL);
server.reuqestHeader = request;
if (sindex != -1)
{
server.reuqestHeader = request.Substring(0, sindex);
server.reuqestBody = request.Substring(sindex + 4, request.Length - sindex - 4);
int contentLength = Encoding.UTF8.GetBytes(server.reuqestBody).Length;
String newContentLength = Content_Length_Str_M + contentLength;
if (request.IndexOf(Content_Length_Str_M) != -1)
{
request = Regex.Replace(request, Content_Length_Str_M + "d+", newContentLength);
}
else
{
request = request.Insert(sindex, "
" + newContentLength);
}
}
else
{
request =