21xrx.com
2024-11-22 12:19:09 Friday
登录
文章检索 我的文章 写文章
使用C++发送GET请求
2023-06-29 12:36:54 深夜i     --     --
C++ 发送 GET请求

在网络编程中,GET请求是一种常见的HTTP请求方法,它用于请求指定资源。

对于C++程序员来说,如何使用C++来发送GET请求呢?下面就来介绍一下具体的实现方法。

首先,我们需要使用socket库来创建一个套接字。然后,我们需要确定我们所要请求的服务器地址和端口号,以及我们要请求的资源。

接下来,我们需要构造GET请求,包括请求头和请求体。请求头包括GET行、Host行、User-Agent行和其他可选的行,请求体一般为空。

构造完成后,我们将请求发送给目标服务器。服务器将返回一个响应,由响应头和响应体组成。

我们首先需要解析响应头,以获取返回的HTTP状态码、Content-Type和Content-Length等信息。如果状态码不是200,则表示请求失败。

如果请求成功,我们可以使用一个循环来读取响应体的内容。读取响应体时,我们可以使用recv函数来接收数据,并保存到文件或内存中,直到数据全部接收完毕。

最后,我们需要关闭套接字。

下面是一个发送GET请求的示例代码:


#include <stdio.h>

#include <winsock2.h>

#define BUF_SIZE 1024

int main()

{

  WSADATA wsaData;

  SOCKET hSocket;

  SOCKADDR_IN servAddr;

  char buf[BUF_SIZE];

  char request[1024];

  char* host = "www.example.com";

  char* path = "/index.html";

  int port = 80;

  // 初始化WinSock

  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {

    printf("WSAStartup() failed\n");

    return 1;

  }

  // 创建套接字

  hSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (hSocket == INVALID_SOCKET) {

    printf("socket() failed\n");

    WSACleanup();

    return 1;

  }

  // 设置服务器地址

  memset(&servAddr, 0, sizeof(servAddr));

  servAddr.sin_family = AF_INET;

  servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  servAddr.sin_port = htons(port);

  // 建立连接

  if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {

    printf("connect() failed\n");

    closesocket(hSocket);

    WSACleanup();

    return 1;

  }

  // 构造GET请求

  sprintf(request, "GET %s HTTP/1.1\r\n", path);

  sprintf(request + strlen(request), "Host: %s\r\n", host);

  sprintf(request + strlen(request), "User-Agent: Mozilla/5.0\r\n");

  sprintf(request + strlen(request), "Accept: */*\r\n");

  sprintf(request + strlen(request), "Connection: close\r\n");

  sprintf(request + strlen(request), "\r\n");

  // 发送请求

  send(hSocket, request, strlen(request), 0);

  // 接收响应

  int content_length = -1;

  while (1) {

    int len = recv(hSocket, buf, BUF_SIZE, 0);

    if (len == 0) break;

    if (len == SOCKET_ERROR) {

      printf("recv() failed\n");

      break;

    }

    if (content_length == -1) {

      char* p = strstr(buf, "Content-Length:");

      if (p != NULL) {

        content_length = atoi(p + 16);

      }

    }

    fwrite(buf, 1, len, stdout);

  }

  // 关闭套接字

  closesocket(hSocket);

  // 清理WinSock

  WSACleanup();

  return 0;

}

以上就是使用C++发送GET请求的基本方法。当然,对于实际项目中的HTTP请求,还需要考虑重定向、代理、Cookie等问题。希望这篇文章能对您有所帮助。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复