资源简介
有详细BT下载器实战代码 以及程序员必备的编码规范 和linux基础的学习内容
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include “parse_metafile.h“
#include “bitfield.h“
extern int pieces_length;
extern char *file_name;
Bitmap *bitmap = NULL; // 指向位图
int download_piece_num = 0; // 当前已下载的piece数
// 如果存在一个位图文件则读位图文件并把获取的内容保存到bitmap
// 如此一来就可以实现断点续传即上次下载的内容不至于丢失
int create_bitfield()
{
bitmap = (Bitmap *)malloc(sizeof(Bitmap));
if(bitmap == NULL) {
printf(“allocate memory for bitmap fiailed\n“);
return -1;
}
// pieces_length除以20即为总的piece数
bitmap->valid_length = pieces_length / 20;
bitmap->bitfield_length = pieces_length / 20 / 8;
if( (pieces_length/20) % 8 != 0 ) bitmap->bitfield_length++;
bitmap->bitfield = (unsigned char *)malloc(bitmap->bitfield_length);
if(bitmap->bitfield == NULL) {
printf(“allocate memory for bitmap->bitfield fiailed\n“);
if(bitmap != NULL) free(bitmap);
return -1;
}
char bitmapfile[64];
sprintf(bitmapfile“%dbitmap“pieces_length);
int i;
FILE *fp = fopen(bitmapfile“rb“);
if(fp == NULL) { // 若打开文件失败说明开始的是一个全新的下载
memset(bitmap->bitfield 0 bitmap->bitfield_length);
} else {
fseek(fp0SEEK_SET);
for(i = 0; i < bitmap->bitfield_length; i++)
(bitmap->bitfield)[i] = fgetc(fp);
fclose(fp);
// 给download_piece_num赋新的初值
download_piece_num = get_download_piece_num();
}
return 0;
}
int get_bit_value(Bitmap *bitmapint index)
{
int ret;
int byte_index;
unsigned char byte_value;
unsigned char inner_byte_index;
if(index >= bitmap->valid_length) return -1;
byte_index = index / 8;
byte_value = bitmap->bitfield[byte_index];
inner_byte_index = index % 8;
byte_value = byte_value >> (7 - inner_byte_index);
if(byte_value % 2 == 0) ret = 0;
else ret = 1;
return ret;
}
int set_bit_value(Bitmap *bitmapint indexunsigned char v)
{
int byte_index;
unsigned char inner_byte_index;
if(index >= bitmap->valid_length) return -1;
if((v != 0) && (v != 1)) return -1;
byte_index = index / 8;
inner_byte_index = index % 8;
v = v << (7 - inner_byte_index);
bitmap->bitfield[byte_index] = bitmap->bitfield[byte_index] | v;
return 0;
}
int all_zero(Bitmap *bitmap)
{
if(bitmap->bitfield == NULL) return -1;
memset(bitmap->bitfield0bitmap->bitfield_length);
return 0;
}
int all_set(Bitmap *bitmap)
{
if(bitmap->bitfield == NULL) return -1;
memset(bitmap->bitfield0xffbitmap->bitfield_length);
return 0;
}
void release_memory_in_bitfield()
{
if(bitmap->bitfield != NULL) free(bitmap->bitfield);
if(bitmap != NULL) free(bitmap);
}
int print_bitfield(Bitmap *bitmap)
{
int i;
for(i = 0; i < bitmap->bitfield_length; i++) {
printf(“%.2X “bitmap->bitfield[i]);
if( (i+1) % 16 == 0) printf(“\n“);
}
printf(“\n“);
return 0;
}
int
相关资源
- 《Linux基础千锤百炼》v2.pdf
- Linux系统编程中文版.pdf
- 嵌入式LINUX基础教程第2版.pdf
- linux 学习手册 linux基础 linux高级教程
- Linux基础及应用教程基于CentOS7 第2版
- UnixLinux基础讲义
-
嵌入式Linux基础教程em
bedded Linux pr - linux基础Ubuntu基础全集黑马/传智
- 三期视频网上买的,带课件,安装包
- 嵌入式LINUX基础教程中文第2版 --百度
- Linux基础及应用教程(基于CentOS 7)
- 14 千锋Linux基础教程-2Linux云主机系统
- Linux教程孟庆昌版课后答案1,2,3,
- linux基础教程.pdf
- 2014马哥linux基础视频教程百度网盘8
- linux基础及应用课后习题答案 .pdf
- Linux基础千锤百炼 v2.pdf
- 细说Linuxpdf文件--兄弟连版
- 细说Linux细说Linux
- linux基础命令教程豪华版
评论
共有 条评论