⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 302.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        //NOTE: I have changed Content-Length to ength because <br>

        //      people have notified me that some servers don't <br>

        //      capitalize the L in length. <br>

        temp = strstr (buffer, "ength: "); <br>

        if (temp != NULL) <br>

        {       for (i = 0; temp[i + 7] != '\r'; i++) <br>

                        URL->left[i] = temp[i + 7]; <br>

                URL->left [i] = '\0'; <br>

                URL->lleft = atol(URL->left); <br>

                if (URL->lsize == URL->lleft) <br>

                {       printf("Error... I think that you are trying to resu <br>



me aa file that has already been downloaded!\n"); <br>

                        return 0; <br>

                } <br>

                printf("%s bytes left to download!\r\n", URL->left); <br>

                URL->resume = 1; <br>

                URL->lleft -= (bsize-(fin-buffer)); <br>

        } else <br>

        {       printf("Error in web site file size estimation, or unknown s <br>

erveer type\n\n"); <br>

                URL->resume = 0; <br>

                URL->lleft = 2000000000; <br>

        } <br>

        fwrite(fin,bsize-(fin-buffer),1,URL->fp); <br>

        printf("[."); <br>

        fflush(NULL); <br>

        return 1; <br>

} <br>

bool ReadFTPListing (URLp URL) <br>

////////////////////////////////////// <br>

// <br>

// <br>

// <br>

// <br>

////////////////////////////////////// <br>

{       int result = 1; <br>

        int len = 1; <br>

        int i = 0; <br>

        int j = 0; <br>

        int k = 0; <br>

        int listfd = 0; <br>

        int datafd = 0; <br>

        char buffer[64000], buffer2[64000], buffer3[64000], buffer4[64000]; <br>

        char lhost[5][4]; <br>

        char *rbuffer = NULL; <br>

        struct sockaddr_in datastream, liststream; <br>

        URL->resume = 1; <br>

        while(result > 0) <br>

        {       result = read(URL->sockfd, buffer + len - 1, sizeof(buffer) <br>

+ leen - 1); <br>

                len += result; <br>

                if (strstr(buffer, "200") != NULL) <br>

                        result = 0; <br>

        } <br>

        rbuffer = strstr(buffer, "Passive Mode ("); <br>

        if (rbuffer == NULL) <br>



        {       printf("PASV mode not supported, aborting.\n"); <br>

                exit(0); <br>

        } else <br>

        for (i = 14; (unsigned)i < strlen(rbuffer) && rbuffer[i] != ')'; i++ <br>

) <br>

                if (rbuffer[i] == ',') <br>

                {       lhost[j][k] = '\0'; <br>

                        j++; <br>

                        k = 0; <br>

                } else <br>

                lhost[j][k++] = rbuffer[i]; <br>

        listfd = socket(AF_INET, SOCK_STREAM, 0); <br>

        if (listfd == -1) <br>

        {       printf("Error opening socket to FTP server for LIST!\n"); <br>

                return(0); <br>

        } <br>

        liststream.sin_family = AF_INET; <br>

        liststream.sin_port = htons(atoi(lhost[4])*256 + atoi(lhost[5])); <br>

        memcpy(&liststream.sin_addr, URL->host->h_addr, URL->host->h_length) <br>

; <br>

        if (connect(listfd, (struct sockaddr *)&liststream, sizeof(liststrea <br>

m)) == -1) <br>

m)) == -1) <br>

        {       printf("Error connecting to FTP socket for LIST!\n"); <br>

                close(listfd); <br>

                URL->retry = 1; <br>

                return(0); <br>

        } <br>

        result = 1; <br>

        len = 1; <br>

        while(result > 0) <br>

        {       result = read(listfd, buffer2 + len - 1, sizeof(buffer2) + l <br>

en -- 1); <br>

                len += result; <br>

        } <br>

        int whitespace = 0; <br>

        for (j = 0; (unsigned)j < strlen(buffer2) && whitespace < 4; j++) <br>

        {       if (buffer2[j] == ' ' && buffer2[j + 1] != ' ') <br>

                        whitespace ++; <br>

        } <br>

        for (k = 0; (unsigned)j < strlen(buffer2); j++) <br>

                if (buffer2[j] == ' ' || (buffer2[j] > ('0' - 1) && buffer2[ <br>

j] << ('9' + 1))) <br>

                        URL->total[k++] = buffer2[j]; <br>

                else <br>



                        j = strlen(buffer2); <br>

        URL->total[j - 4] = '\0'; <br>

        URL->ltotal = atol(URL->total); <br>

        printf("File size: %lld bytes\n", URL->ltotal); <br>

        close(listfd); <br>

        write(URL->sockfd, "PASV\r\n", 6); <br>

        write(URL->sockfd, "REST 0\r\n", 8); <br>

        write(URL->sockfd, "NOOP\r\n", 6); <br>

        result = 1; <br>

        len = 1; <br>

        while(result > 0) <br>

        {       result = read(URL->sockfd, buffer3 + len - 1, sizeof(buffer3 <br>

) + len - 1); <br>

                len += result; <br>

                if (strstr(buffer3, "200") != NULL) <br>

                        result = 0; <br>

        } <br>

        rbuffer = strstr(buffer3, "Passive Mode ("); <br>

        if (rbuffer == NULL) <br>

                return(0); <br>

        else <br>

                for (i = 14, j = 0, k = 0; (unsigned)i < strlen(rbuffer) && <br>



rbufffer[i] != ')'; i++) <br>

                        if (rbuffer[i] == ',') <br>

                        {       lhost[j][k] = '\0'; <br>

                                j++; <br>

                                k = 0; <br>

                        } <br>

                        else <br>

                        lhost[j][k++] = rbuffer[i]; <br>

        URL->fp = fopen (URL->filename, "a+b"); <br>

        URL->lsize = ftell(URL->fp); <br>

        if (URL->lsize >= URL->ltotal) <br>

        {       printf("Error... It seems this file has already been downloa <br>

ded..\n"); <br>

                return(0); <br>

        } else <br>

        if (URL->fp == NULL) <br>

        {       printf("Error opening file %s\n", URL->filename); <br>

                return(0); <br>

        } else <br>

        if (URL->lsize < rollback) <br>

                URL->lsize = 0; <br>

        else <br>

        else <br>

                URL->lsize -= rollback; <br>

        ftruncate(fileno(URL->fp), URL->lsize); <br>

        sprintf(URL->size, "%lld", URL->lsize); <br>

        printf("Resuming from %s bytes.\n\n", URL->size); <br>

        write(URL->sockfd, "TYPE I\r\n", 8); <br>

        write(URL->sockfd, "REST ", 5); <br>

        write(URL->sockfd, URL->size, strlen(URL->size)); <br>

        write(URL->sockfd, "\r\n", 2); <br>

        dldots = (long long)URL->lsize / rollback; <br>

        write(URL->sockfd, "RETR ", 5); <br>

        write(URL->sockfd, URL->file, strlen(URL->file)); <br>

        write(URL->sockfd, "\r\n", 2); <br>

        datafd = socket(AF_INET, SOCK_STREAM, 0); <br>

        if (datafd == -1) <br>

        {       printf("Error opening socket to FTP server for RETR!\n"); <br>

                URL->retry = 1; <br>

                return(0); <br>

        } <br>

        datastream.sin_family = AF_INET; <br>

        datastream.sin_port = htons(atoi(lhost[4])*256 + atoi(lhost[5])); <br>

        memcpy(&datastream.sin_addr, URL->host->h_addr, URL->host->h_length) <br>

; <br>

; <br>

        if (connect(datafd, (struct sockaddr *)&datastream, sizeof(datastrea <br>

m)) == -1) <br>

        {       printf("Error connecting to FTP socket for RETR!\n"); <br>

                close(datafd); <br>

                URL->retry = 1; <br>

                return(0); <br>

        } <br>

        result = 1; len = 1; <br>

        while(result > 0) <br>

        {       result = read(URL->sockfd, buffer4 + len - 1, sizeof(buffer4 <br>

) + len - 1); <br>

                len += result; <br>

                if (strstr(buffer4, "350") != NULL) <br>

                        result = 0; <br>

        } <br>

        listfd = URL->sockfd; <br>

        URL->sockfd = datafd; <br>

        close (listfd); <br>

        URL->lleft = URL->ltotal - URL->lsize; <br>

        printf("[."); <br>

        return (1); <br>

} <br>

} <br>

void Download(URLp URL) <br>

////////////////////////////////////// <br>

//      void Download(URLp URL) <br>

// <br>

//      Downloads up to 4k of data from URL->sockfd and writes it to URL->fp <br>

  <br>

// <br>

// Pre:  Assigned(URL->sockfd) && Assigned(URL->lleft) && Assigned(URL->fp) <br>

&& UURL->done != 1 <br>

// Post: set URL->done = 1, if finished. <br>

////////////////////////////////////// <br>

{       int bsize = 1; <br>

        char buff[rollback]; <br>

        bsize = read(URL->sockfd, buff, sizeof(buff)); <br>

        URL->lleft = URL->lleft - bsize; <br>

        if (bsize > 0) <br>

                dlstat += bsize; <br>

        fwrite(buff, bsize, 1, URL->fp); <br>

        if (dlstat > rollback - 1) <br>

        {       printf("."); <br>

                dlstat -= rollback; <br>

                fflush(NULL); <br>



                dldots ++; <br>

                if (dldots%50 == 0) <br>

                {       printf("]  -%ldk %.2fk/sec- \n[.", (rollback * dldot <br>

s) // 1024, <br>

                                ((float)((rollback * 50) / 1024)) <br>

                                 / ((float)(time((time_t *)0) - start))); <br>

                        start = time((time_t *)0); <br>

                } <br>

        } <br>

        if ((bsize < 1) || (URL->lleft < 1 && URL->resume)) <br>

        {       if (dldots%50 == 0) <br>

                        printf("] -%ldk %.2fk/sec-\n\nChecking Completion St <br>

atuss...\n", <br>

                                (rollback * dldots)/1024, <br>

                                ((float)((rollback * 1) / 1024)) / <br>

                                 ((float)(time((time_t *)0) - start))); <br>

                else <br>

                        printf("] -%ldk %.2fk/sec-\n\nChecking Completion St <br>

atuss...\n", <br>

                                (rollback * dldots)/1024, <br>

                                ((float)((rollback * (dldots%50)) / 1024)) / <br>

  <br>

  <br>

                                 ((float)(time((time_t *)0) - start))); <br>

                close(URL->sockfd); <br>

                fclose(URL->fp); <br>

                URL->done = 1; <br>

                printf("%s Done!\n\n", URL->filename); <br>

        } <br>

} <br>

int main (int argc, char *argv[]) <br>

////////////////////////////////////// <br>

// <br>

// <br>

// <br>

// <br>

////////////////////////////////////// <br>

{       URLp URL = &URLst; <br>

        int i; <br>

        printf("%s  [Get and Resume Elite EDition] - By Anoakie Turner\r\n", <br>

 CURRRENT_VERSION); <br>

        for (i = 1; i < argc; i ++) <br>

                if (argv[i][0] == '-') <br>

                {       if (argv[i][1] == 'n' || argv[i][1] == 'N') <br>

                        {       argv[i] = GGR; <br>



                        } else <br>

                        {       printf("\n\nUSEAGE: greed URL(1) URL(2) ... <br>

URL((N)\n"); <br>

                                printf("i.e.: greed %s ftp://some.where/out/ <br>

therre.tar.gz\n", GGR); <br>

                                exit(0); <br>

                        } <br>

                } <br>

        for (i = 1; i < argc; i ++) <br>

        {       strcpy(URL->name, argv[i]); <br>

                if (Parse(URL)) <br>

                if (Connect(URL)) <br>

                if ((URL->protocol == HTTP && ReadHTTPHeader(URL)) || <br>

                    (URL->protocol == FTP && ReadFTPListing(URL))) <br>

                {       start = time((time_t *)0); <br>

                        while (!URL->done) <br>

                                Download(URL); <br>

                } <br>

                close (URL->sockfd); <br>

                if (URL->retry == 1) <br>

                {       URL->retry = 0; <br>

                        i--; <br>



                        printf("Retrying in 5 seconds...\n"); <br>

                        sleep(5); <br>

                } <br>

        } <br>

        return(EXIT_SUCCESS); <br>

} <br>

  <br>

-- <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="195.htm">上一层</a>][<a href="303.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -