菜鸟的求救!用C语言制作的一个输入网址,把该网址下载下来的程序

根根小盆友 2013-02-24 05:35:55
用C语言写一个程序,该程序输入一个网址,然后程序把该网址上的内容下载下来,使用socket,谁能提供一下思路或者代码啊?十分感谢了!不知道该如何去实现这个程序。对网页不是很熟悉。不知道如何用socket去连接网页,本人中级菜鸟吧-_-求大神指导!
...全文
215 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
铁文 2013-02-25
  • 打赏
  • 举报
回复
如果是自己学习的话,用Curl吧,看它的实现。 如果是写着玩的,改用Python吧,一句搞定。
mujiok2003 2013-02-25
  • 打赏
  • 举报
回复
Curl / libUrl
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
参考WebSeizer软件
慕少艾 2013-02-25
  • 打赏
  • 举报
回复
wget 。。。。。。。。。。。。。。。。。
mujiok2003 2013-02-25
  • 打赏
  • 举报
回复
引用 5 楼 qn20080206 的回复:
引用 3 楼 mujiok2003 的回复:Curl / libUrl 我没看懂你发的这个是什么意思
Google 一下,你就知道
根根小盆友 2013-02-25
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
Curl / libUrl
我没看懂你发的这个是什么意思
根根小盆友 2013-02-25
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
参考WebSeizer软件
网页下载器?
Wolf0403 2013-02-24
  • 打赏
  • 举报
回复

int do_select (int count, const int *s, int rwx, int *out_rwx, struct timeval *timeout) {// same action for all
    fd_set set[3];
    int maxfd = s[0];
    if (rwx < 0 || rwx > 2) {
        return -1;
    }
    for (int i = 0; i < 3; ++i) {
        FD_ZERO (set + i);
    }
    int fds = 0;
    for (int i = 0; i < count; ++i) {
        if (s[i] < 0) {
            continue;
        }
        ++fds;
        FD_SET (s[i], set + rwx);
        maxfd = maxfd > s[i] + 1 ? maxfd : s[i] + 1;
    }
    if (0 == fds) {
        return 0;
    }
    int rt = select (maxfd, set, set + 1, set + 2, timeout);
    for (int j = 0; j < 3; ++j) {
        fd_set *pset = set + j;
        for (int i = 0; i < count; ++i) {
            if (s[i] < 0) {
                continue;
            }
            if (FD_ISSET (s[i], pset)) {
                out_rwx[i] = j;
            }
        }
    }
    return rt;
}

int
test_send (char *host, char *uri) {
    if (!uri) {
        uri = "/";
    }
    short port = 80;
    int s = socket (AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in	servaddr;
	bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(port);

    struct hostent *he = gethostbyname (host);
    if (!he || !he->h_addr) {
        exit (1);
    }
    memmove (&servaddr.sin_addr, he->h_addr, he->h_length);
    //servaddr.sin_addr.s_addr = *(struct in_addr *)he->h_addr;

    char addrbuf[1024];
    inet_ntop (AF_INET, he->h_addr, addrbuf, sizeof(addrbuf));
    //inet_ntoa_r (servaddr.sin_addr.s_addr, addrbuf, sizeof(addrbuf));
    short dstport = ntohs (servaddr.sin_port);
    printf ("Connecting to: %s:%d\n", addrbuf, dstport);
    printf ("Connecting to: %s:%d\n", inet_ntoa (servaddr.sin_addr), dstport);

    int connected = connect (s, (struct sockaddr *)&servaddr, sizeof(servaddr));
    if (connected < 0) {
        perror ("connect:");
        exit (1);
    }
    printf ("connected! \n");

    fd_set wset; 
    FD_ZERO (&wset);
    FD_SET (s, &wset);
    select (s + 1, 0, &wset, 0, 0);

    const char *keepalive = "Connection: Close\r\n";
    long kalen = 24, reqlen;
    char *req = create_request (uri, strlen(uri),
        host, strlen(host), keepalive, kalen, &reqlen);
    char *r = req;
    while (reqlen -= send (s, r, reqlen, 0)) {
        r += reqlen;
    }
    // shutdown (s, SHUT_WR);
    return s;
}

void
test_connect (char *host, char *uri) {
    int s = test_send (host, uri);
    fd_set wset;
    FD_ZERO (&wset);
    FD_SET (s, &wset);
    char buf[4096];
    long resplen = 0, total = 0;

    while (1) {
/*
        FD_ZERO (&wset);
        FD_SET (s, &wset);
        if (select (s + 1, &wset, 0, 0, 0) < 0) {
            break;
        }
        if (FD_ISSET (s, &wset)) {
*/
        int fdset[] = { s }, out[1];
        if (do_select (1, fdset, READ, out, 0) < 1) {
            perror ("do_select");
            break;
        }
        if (out[0] == READ) {
            resplen = recv (s, buf, sizeof(buf), 0);
            if (resplen == 0) {
                break;
            }
            total += resplen;
            printf ("READ: %ld, TOTAL: %ld\n", resplen, total);
       }
    }
    close (s);
}

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧