提醒:
最近没有发表什么文章,但偶然发现博客排名一直向前走,才让我又回到了博客的空间来。
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_DEBUG
fprintf(stderr, "select: %s\n", strerror(errno));
#endif
return -1;
}
else if (0 == ret) {
/*超时, 继续轮询*/
#ifdef SPIDER_DEBUG
fprintf(stderr, "select timeout: %s\n", spider->blog->b_title);
#endif
goto 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;
}