socket https php,C#如何使用Socket发送HTTP/HTTPS请求实例详解

本文介绍了一种C#通过Socket高效发送HTTP/HTTPS请求的方法,适用于自组HTTP封包。作者提供了经过一年测试和完善的核心代码,并分享了一个简单的HTTP发包工具。文章中详细讲解了如何处理HTTP和HTTPS请求,包括异常重试、内容长度计算、Header处理和Chunked传输等关键部分。
摘要由CSDN通过智能技术生成

这篇文章主要介绍了c#使用Socket发送HTTP/HTTPS请求的实现代码,需要的朋友可以参考下

C# 自带的HttpWebRequest效率太低,对于自组HTTP封包不好操作。

在写超级SQL注入工具时,研究了很长一段时间如何使用Socket来发送HTTP、HTTPS请求。

经过一年的修改和测试,可完美、高效发送并解析HTTP/HTTPS请求。修改过无数次bug。

在这里把核心代码分享出来,供大家学习或做开发参考。

用这个代码写了一个简单的HTTP发包工具。供大家参考。

2e6c0d97abc2f9b7da42980da55c76e8.png

工具下载:

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 =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值