一些博客和代码的提醒

来源:互联网 发布:淘宝开学爆到是什么 编辑:程序博客网 时间:2024/06/17 21:55

提醒:

最近没有发表什么文章,但偶然发现博客排名一直向前走,才让我又回到了博客的空间来。

1.最近有些网友在关注我写的C++的笔记,我想说的是:那是前段时间自己复习基础语法,顺便写下来的,没有多大的参考价值,希望需要的网友参考比较完整的书籍,不希望网友浪费宝贵的时间。


2.在一月份曾经发布了C语言版本(Linux平台)的CSDN博客备份工具,有很多感兴趣的,初学Linux的网友将代码作为参考,有个需要注意的:代码的效率有改进的空间,而且使用方法和注释可能会误导初学者,所以建议需要的网友查询相关资料以保证代码使用的正确方法。

有一个需要提的,在代码里面,用到了select函数,在这里我简单的提一下:

static int recv_response(const blog_spider * spider){int ret, end, recvsize, count;char recvbuf[BUFSIZE];fd_set read_fds;struct timeval timeout;FILE *fp;/*建议时间要长点, select失败可能的原因是收到网站的响应消息超时,也可以传入NULL*/timeout.tv_sec  = 30;timeout.tv_usec = 0;FD_ZERO(&read_fds);FD_SET(spider->blog->b_sockfd, &read_fds);while (1) {ret = select(spider->blog->b_sockfd+1, &read_fds, NULL, NULL, &timeout);if (-1 == ret) {/*出错,直接返回错误*/#ifdef SPIDER_DEBUGfprintf(stderr, "select: %s\n", strerror(errno));#endifreturn -1;}else if (0 == ret) {/*超时, 继续轮询*/#ifdef SPIDER_DEBUGfprintf(stderr, "select timeout: %s\n", spider->blog->b_title);#endifgoto fail_recv_response;}/*接受到数据*/if (FD_ISSET(spider->blog->b_sockfd, &read_fds)) {end = 0;count = 0;/*这里出错可能是文件名不规则,比如"3/5",'/'在Linux是代表目录*/fp = fopen(spider->blog->b_local_file, "w+");if (NULL == fp) {goto fail_recv_response;}spider->blog->b_download = BLOG_DOWNLOAD;while (read(spider->blog->b_sockfd, recvbuf, 1) == 1) {if(end< 4) {if(recvbuf[0] == '\r' || recvbuf[0] == '\n')  {end++;}else {end = 0;}/*这里是http服务器反馈的消息头,若需要,则可以保存下来*/}else {fputc(recvbuf[0], fp);count++;if (1024 == count) {fflush(fp);}}}fclose(fp);break;}}FD_CLR(spider->blog->b_sockfd, &read_fds);return 0;fail_recv_response:spider->blog->b_download = BLOG_UNDOWNLOAD;FD_CLR(spider->blog->b_sockfd, &read_fds);return -1;}

在使用select(spider->blog->b_sockfd+1, &read_fds, NULL, NULL, &timeout)函数时,由于select会把timeout结构体给清空,所以若要使用自定义超时时间,必须在select函数返回之后,重新设置timeout结构体。

或者直接传NULL,无限等待,这样也可以,希望不要误导初学者。


3.在查询博客链表长度,我每次重新遍历,可以再改进,原来的代码:

/*********************************************************返回爬虫链表长度*********************************************************/static int spider_size(blog_spider * spider_head){int count = 0;blog_spider *pspider;pspider = spider_head;while (pspider->next) {pspider = pspider->next;count++;}return count;}


每次重新遍历链表,效率很低,可以设置一个全局变量来保存长度。也可以设置一个指向最后一个节点的指针,每次求长度只需与首节点地址想减,再除以指针大小,就可以得到长度。
原创粉丝点击