gcc/g++过程解析


正常而言一个程序翻译的过程分为如下几个阶段:预处理,编译,汇编,链接。gcc是以C语言的形式编译程序,而g++是以C++的形式去编译程序,但是他们都需要经过以上几个阶段完成翻译。这里将以gcc作为样例来介绍编译的过程。

gcc使用方法

使用方法: gcc [选项] 要编译的文件 [选项] [目标文件
直接使用gcc + 文件名会默认生成一个a.out的可执行文件
在这里插入图片描述
使用./a.out可以执行可执行文件(./代表执行当前路径下的a.out文件,用来指明路径,也可以使用绝对路径)
在这里插入图片描述

gcc编译过程

使用样例

#include<stdio.h>

#define Num 100
int main()
{
   
  printf("hello world\n");
 //  printf("hello world\n");
 //  printf("hello world\n");
 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的HTTP代理程序的示例代码,使用C语言编写。它使用了libcurl库来进行HTTP请求和响应的处理。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netdb.h> #include <curl/curl.h> #define MAX_CLIENTS 10 #define BUFFER_SIZE 4096 int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s <port>\n", argv[0]); exit(EXIT_FAILURE); } int port = atoi(argv[1]); int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { perror("Failed to create socket"); exit(EXIT_FAILURE); } struct sockaddr_in server_addr, client_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(port); if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("Failed to bind socket"); exit(EXIT_FAILURE); } if (listen(server_fd, MAX_CLIENTS) < 0) { perror("Failed to listen on socket"); exit(EXIT_FAILURE); } printf("Listening on port %d...\n", port); while (1) { socklen_t client_addr_len = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len); if (client_fd < 0) { perror("Failed to accept client connection"); continue; } char buffer[BUFFER_SIZE]; ssize_t num_bytes = recv(client_fd, buffer, BUFFER_SIZE, 0); if (num_bytes < 0) { perror("Failed to receive data from client"); close(client_fd); continue; } char *host = NULL; char *path = NULL; // Parse HTTP request to extract host and path if (sscanf(buffer, "GET http://%m[^/]/%ms HTTP/1.1\r\n", &host, &path) < 2) { perror("Failed to parse HTTP request"); close(client_fd); continue; } // Resolve hostname to IP address struct hostent *he = gethostbyname(host); if (he == NULL || he->h_addr_list[0] == NULL) { perror("Failed to resolve hostname"); close(client_fd); continue; } char ip_address[INET_ADDRSTRLEN]; inet_ntop(AF_INET, he->h_addr_list[0], ip_address, INET_ADDRSTRLEN); // Send HTTP request to server CURL *curl = curl_easy_init(); if (curl == NULL) { perror("Failed to create CURL handle"); close(client_fd); continue; } curl_easy_setopt(curl, CURLOPT_URL, buffer + 4); curl_easy_setopt(curl, CURLOPT_WRITEDATA, client_fd); struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "Failed to send HTTP request: %s\n", curl_easy_strerror(res)); close(client_fd); continue; } curl_slist_free_all(headers); curl_easy_cleanup(curl); close(client_fd); } close(server_fd); return 0; } ``` 该程序使用TCP套接字来侦听客户端连接,并使用libcurl库来发送HTTP请求和处理响应。当客户端连接到代理服务器时,它接收HTTP请求并解析出主机名和路径。然后,它使用gethostbyname函数将主机名解析为IP地址,并使用libcurl发送HTTP请求到该IP地址和路径。最后,它将HTTP响应发送回客户端。 为了编译该程序,请使用以下命令: ``` gcc -o proxy proxy.c -lcurl ``` 要运行该程序,请使用以下命令: ``` ./proxy <port> ``` 其中,`<port>`是代理服务器将侦听的端口号。请注意,客户端不能来自预先确定的IP地址,因为该程序没有实现IP地址过滤。如果您需要实现这个功能,请在程序中添加相应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值