我如何用套接字发送GET请求

本文关键字:GET 请求 套接字 何用 | 更新日期: 2023-09-27 17:53:42

我想用套接字发送GET/POST请求,我有这个代码:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(Url, 80);
byte[] contentLenght = Encoding.ASCII.GetBytes(Data);
string[] masRequestString ={
    "GET /"+Data+" HTTP/1.1'r'n" ,
    "Host: "+Url+"'r'n",
    "User-Agent: "+textBox1.Text+"'r'n",
    "Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'r'n",
    "Content-Type: application/x-www-form-urlencoded; charset=UTF-8'r'n",
    "Referer: "+textBox2.Text+"'r'n"};
string request = string.Concat(masRequestString);
Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
socket.Send(bytesSent, bytesSent.Length, 0);
Byte[] bytesReceived = new Byte[0x400];
int bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
string content = Encoding.ASCII.GetString(bytesReceived, 0, bytes);

当我尝试发送请求嗅探器没有看到它。为什么?

我如何用套接字发送GET请求

我不知道你是怎么嗅探的,但是

  • 你没有发送一个正确的请求,因为它在最后错过了一个'r'n
  • 您希望服务器在响应完成后关闭连接。相反,你需要关心content-length头和分块编码。
  • 除此之外,发送一个带有GET请求的Content-type头是没有意义的,因为在GET请求中没有内容发送(只在响应中)。

我建议你在尝试实现它之前先深入了解HTTP的工作原理。当然,使用已经存在的实现要好得多,因为HTTP并不是一个简单的协议,它看起来只是简单的一瞥。

不要尝试自己实现HTTP,套接字可以获取数据并包装它。使用HTTP库:

using System.Net;
string url = "https://www.example.com/scriptname.php?var1=hello";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();