如何使用C Socket编程下载文件

3

如何制作类似于Internet Download Manager的程序,以便从互联网下载给定链接的文件。可以使用C语言套接字编程从互联网下载文件。

非常感谢您的帮助。

2个回答

11
  1. 使用socket()创建一个套接字。
  2. 在套接字上调用connect()
  3. 使用send()write()正确发送一个GET /path/filename HTTP/1.0\r\n\r\n请求。
  4. 使用recv()read()正确接收响应。
  5. 解析响应以确定请求是否成功,并查找文件数据的格式。
  6. 如果有文件数据,请使用recv()read()接收它。
  7. 使用close()关闭套接字。

进一步阅读:


1
这里的“文件名”指完整地址,例如:www.site.com/file.pdf 或仅为文件名。 - Pawan Chaurasiya
它包括相对于服务器根目录的文件路径,例如/html/index.html - alk
1
@Pawan:在GET行中不要包含主机名。你需要使用单独的Host行来指定主机名:GET /file.pdf HTTP/1.1\r\nHost: www.site.com\r\n\r\n - Remy Lebeau

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

// www.axmag.com/download/pdfurl-guide.pdf
int main(int argc , char *argv[])
{
    int socket_desc;

    char *message;
    char server_reply[10000];
    char *filename = "file.pdf";
    int total_len = 0;
    int file_len = 99352;

    int len; 

    FILE *file = NULL;
    struct sockaddr_in server;

    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }

    server.sin_addr.s_addr = inet_addr("198.11.181.184");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    //Connect to remote server
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected\n");

    //Send request
    message = "GET /download/pdfurl-guide.pdf HTTP/1.1\r\nHost: www.axmag.com\r\n\r\n Connection: keep-alive\r\n\r\n Keep-Alive: 300\r\n";

    if( send(socket_desc , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }

    puts("Data Send\n"); 

    remove(filename);
    file = fopen(filename, "ab");

    if(file == NULL){
        printf("File could not opened");
    }   

    while(1)
    {
        int received_len = recv(socket_desc, server_reply , sizeof server_reply , 0);

        if( received_len < 0 ){
            puts("recv failed");
            break;
        }

        total_len += received_len;

        //puts(server_reply);   
        fwrite(server_reply , received_len , 1, file);

        printf("\nReceived byte size = %d\nTotal lenght = %d", received_len, total_len);

        if( total_len >= file_len ){
            break;
        }   
    }

    puts("Reply received\n");

    fclose(file);

    return 0;
}

你为什么使用“198.11.181.184”作为互联网地址? - africanxmamba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接