一些博客和代码的提醒

提醒:

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

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;
}


每次重新遍历链表,效率很低,可以设置一个全局变量来保存长度。也可以设置一个指向最后一个节点的指针,每次求长度只需与首节点地址想减,再除以指针大小,就可以得到长度。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值