【问题标题】:How can I send GET request with sockets?如何使用套接字发送 GET 请求?
【发布时间】:2015-08-21 05:16:38
【问题描述】:

我想用套接字发送 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);

当我尝试发送请求时,嗅探器看不到它。为什么?

【问题讨论】:

    标签: c# sockets get request send


    【解决方案1】:

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

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

    我建议您在尝试实现它之前先对 HTTP 工作有更深入的了解。更好的做法当然是使用已经存在的实现,因为 HTTP 并不是看起来很简单的协议。

    【讨论】:

      【解决方案2】:

      不要尝试自己实现 HTTP,socket 可以获取你的数据并包装它。 使用 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();
      

      【讨论】:

        猜你喜欢
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        相关资源
        最近更新 更多