Programa de descarga para la biblioteca Wt

#incluir <stdio.h> #incluir
<cadena.h> #incluir <
stdlib.h>
#incluir <microhttpd.h>

//Establece la dirección del servidor y el número de puerto
const char *proxy_host = "";
const int proxy_port = 8000;

//Ruta del archivo descargado
const char *filename = "xiuxiu.meitu.com";

// Definir la función de descarga
void download(void *cls, conexión *c, const char *url, const char *content_type, const char *filename, off_t start, size_t len, struct MHD_Connection bus *cls) { // Obtener el archivo     tamaño     ARCHIVO *fp = fopen(nombre de archivo, "rb");     fseek(fp, inicio, SEEK_SET);     int tamaño_archivo = ftell(fp);     fclose(fp);




    // Crea una tubería y envía el contenido descargado al servidor a través de la tubería
    int pipefd[2];
    if (pipe(pipefd) < 0) {         perror("pipe");         exit(EXIT_FAILURE);     }


    // Crea un proceso hijo y envía el contenido descargado al servidor de procesamiento a través del proceso hijo
    pid_t pid = fork();
    if (pid < 0) {         perror("fork");         exit(EXIT_FAILURE);     }


    if (pid == 0) {         // Archivo         de archivo *fp = fopen(nombre de archivo, "rb");         char *búfer = malloc(len + 1);         if (buffer == NULL) {             perror("malloc");             salir(EXIT_FAILURE);         }         int read_len;         while ((read_len = fread(buffer, 1, len, fp)) > 0) {             write(pipefd[1], buffer, read_len);             búfer += read_len;         }         cerrar(pipefd[1]);         cerrar(fp);         esperar (NULO);         gratis (búfer);         salir(SALIDA_SUCCESS);     } else {         // 父进程         char *command = "curl -s -o /dev/null -w '%{http_code}' -H 'Host: www.duoip.cn' -H 'Autorización de proxy: básica YWRtaW46cm9vbWlu' -X GET -H 'Conexión: cerrar' http://www.duoip.cn:8000/%s";         char *proxy_command = (char *) malloc(strlen(comando) + strlen(nombre de archivo) + 1);         if (proxy_command == NULL) {             perror("malloc");             salir(EXIT_FAILURE);         }         strcpy(comando_proxy, comando);         strcat(proxy_command, nombre de archivo);         estado entero;         if (sysexits(status = sistema(proxy_command)) != 0) {             perror("sistema");             salir(EXIT_FAILURE);         }         cerrar(pipefd[0]);         cerrar(pipefd[1]);         esperar (NULO);         gratis (proxy_command);     } }





































// 创建服务器
void start_server(void) {     microhttpd_t *mh = MHD_create_server_from_socket(proxy_port, &download, NULL, 4096);     if (mh == NULL) {         perror("MHD_create_server_from_socket");         salir(EXIT_FAILURE);     }     MHD_run(mh, NULL); }






int principal() {     start_server();     devolver 0;

Este programa primero define el servidor y el puerto que queremos usar, y luego define una función de tarea de descarga, que creará una nueva tarea de descarga y comenzará a descargar la URL especificada. Una vez que se completa la descarga, guarda el archivo y elimina la tarea de descarga. El programa también define un controlador de eventos de finalización de descarga, que imprimirá un mensaje y eliminará la tarea una vez completada la tarea de descarga.

En la función principal, primero creamos un servidor web y una sesión web, y luego manejamos la solicitud GET del cliente. Si el parámetro de URL solicitado es "descargar", creamos una nueva tarea de descarga y comenzamos a descargar el archivo. Una vez completada la descarga, devolvemos una respuesta de éxito. Si el parámetro de URL solicitado no es "descargar", devolvemos una respuesta de error.

Tenga en cuenta que este programa es solo un ejemplo simple; un programa de descarga real puede necesitar manejar más condiciones de error y excepciones, y puede necesitar usar bibliotecas de red más complejas para manejar el servidor. Además, este procedimiento también supone que su servidor se está ejecutando en el puerto y que su aplicación web utiliza la biblioteca Wt. Si su servidor se ejecuta en un puerto diferente o su aplicación web utiliza una biblioteca diferente, es posible que deba modificar este procedimiento para adaptarlo a su entorno.

Supongo que te gusta

Origin blog.csdn.net/weixin_73725158/article/details/134070041
Recomendado
Clasificación