C语言发送GET请求:详细代码示例及注释

本文提供C语言发送GET请求的代码示例,并对代码进行了详细的注释,帮助您理解如何使用C语言与网站进行交互。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

#define MAX_BUFFER_SIZE 1024

int main(int argc, char **argv) {
    int sockfd;
    struct sockaddr_in server_addr;
    struct hostent *server;
    char *host = 'www.example.com';
    char *page = '/index.html';
    char buffer[MAX_BUFFER_SIZE];
    int port = 80;
    int bytes_sent, bytes_received;

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror('Failed to create socket');
        exit(EXIT_FAILURE);
    }

    // 通过主机名获取IP地址
    server = gethostbyname(host);
    if (server == NULL) {
        fprintf(stderr, 'ERROR, no such host\n');
        exit(EXIT_FAILURE);
    }

    // 初始化服务器地址结构体
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    memcpy(&server_addr.sin_addr.s_addr, server->h_addr, server->h_length);
    server_addr.sin_port = htons(port);

    // 连接到服务器
    if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        perror('Failed to connect to server');
        exit(EXIT_FAILURE);
    }

    // 构造GET请求
    sprintf(buffer, 'GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n', page, host);

    // 发送GET请求到服务器
    bytes_sent = send(sockfd, buffer, strlen(buffer), 0);
    if (bytes_sent < 0) {
        perror('Failed to send request to server');
        exit(EXIT_FAILURE);
    }

    // 接收服务器响应
    while ((bytes_received = recv(sockfd, buffer, MAX_BUFFER_SIZE - 1, 0)) > 0) {
        buffer[bytes_received] = '\0';
        printf('%s', buffer);
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

代码注释:

  1. #include 头文件用于引入相关的库和函数。
  2. #define 定义了一个宏变量 MAX_BUFFER_SIZE,用于存储接收到的最大数据大小。
  3. int main(int argc, char **argv) 是程序的入口函数。
  4. int sockfd; 创建一个套接字描述符,用于存储套接字的标识符。
  5. struct sockaddr_in server_addr; 定义了一个用于存储服务器地址的结构体。
  6. struct hostent *server; 定义了一个用于存储主机信息的结构体指针。
  7. char *host = 'www.example.com'; 定义了服务器主机名。
  8. char *page = '/index.html'; 定义了要请求的页面。
  9. char buffer[MAX_BUFFER_SIZE]; 定义了一个用于存储响应数据的缓冲区。
  10. int port = 80; 定义了服务器端口号。
  11. int bytes_sent, bytes_received; 定义了发送和接收的字节数。
  12. sockfd = socket(AF_INET, SOCK_STREAM, 0); 创建一个TCP套接字。
  13. server = gethostbyname(host); 通过主机名获取IP地址。
  14. memset(&server_addr, 0, sizeof(server_addr));server_addr 结构体清空。
  15. memcpy(&server_addr.sin_addr.s_addr, server->h_addr, server->h_length); 将主机IP地址复制到 server_addr 结构体。
  16. server_addr.sin_port = htons(port); 设置服务器端口号。
  17. if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) 建立与服务器的连接。
  18. sprintf(buffer, 'GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n', page, host); 构造GET请求。
  19. bytes_sent = send(sockfd, buffer, strlen(buffer), 0); 发送GET请求到服务器。
  20. while ((bytes_received = recv(sockfd, buffer, MAX_BUFFER_SIZE - 1, 0)) > 0) 接收服务器响应。
  21. close(sockfd); 关闭套接字。
  22. return 0; 返回程序执行结果。

本文代码示例演示了使用C语言发送简单的GET请求,并接收服务器响应。您可以根据实际需求修改代码中的主机名、页面路径和端口号,以访问不同的网站。

注意:

  • 本代码示例仅供参考,在实际应用中可能需要根据具体情况进行修改和完善。
  • 为了保证代码的安全性,建议对接收到的数据进行必要的过滤和验证。
  • 了解相关的网络编程知识和安全策略对于编写安全的网络应用程序至关重要。
C语言发送GET请求:详细代码示例及注释

原文地址: https://www.cveoy.top/t/topic/l48w 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录