├── BitTorrent ├── Makefile ├── bitfield.c ├── bitfield.h ├── bitfield.o ├── bterror.c ├── bterror.h ├── bterror.o ├── data.c ├── data.h ├── data.o ├── log.c ├── log.h ├── log.o ├── main.c ├── main.o ├── message.c ├── message.h ├── message.o ├── parse_metafile.c ├── parse_metafile.h ├── parse_metafile.o ├── peer.c ├── peer.h ├── peer.o ├── policy.c ├── policy.h ├── policy.o ├── sha1.c ├── sha1.h ├── sha1.o ├── signal_hander.c ├── signal_hander.h ├── signal_hander.o ├── tags ├── torrent.c ├── torrent.h ├── torrent.o ├── tracker.c ├── tracker.h ├── tracker.o └── ttorrent └── README.md /BitTorrent/Makefile: -------------------------------------------------------------------------------- 1 | CC=gcc 2 | CFLAGS= -Iinclude -Wall -g -DDEBUG 3 | LDFLAGS=-L./lib -Wl,-rpath=./lib -Wl,-rpath=/usr/local/lib 4 | 5 | ttorrent: main.o parse_metafile.o tracker.o bitfield.o sha1.o message.o peer.o data.o policy.o torrent.o bterror.o log.o signal_hander.o 6 | $(CC) -o $@ $(LDFLAGS) $^ -ldl 7 | 8 | clean: 9 | rm -rf *.o ttorrent 10 | -------------------------------------------------------------------------------- /BitTorrent/bitfield.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/bitfield.c -------------------------------------------------------------------------------- /BitTorrent/bitfield.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/bitfield.h -------------------------------------------------------------------------------- /BitTorrent/bitfield.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/bitfield.o -------------------------------------------------------------------------------- /BitTorrent/bterror.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "bterror.h" 5 | 6 | void btexit(int errno,char *file,int line) 7 | { 8 | printf("exit at %s : %d with error number : %d\n",file, line, errno); 9 | exit(errno); 10 | } 11 | -------------------------------------------------------------------------------- /BitTorrent/bterror.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/bterror.h -------------------------------------------------------------------------------- /BitTorrent/bterror.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/bterror.o -------------------------------------------------------------------------------- /BitTorrent/data.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/data.c -------------------------------------------------------------------------------- /BitTorrent/data.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/data.h -------------------------------------------------------------------------------- /BitTorrent/data.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/data.o -------------------------------------------------------------------------------- /BitTorrent/log.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "log.h" 9 | 10 | int logfile_fd = -1; 11 | 12 | void logcmd(char *fmt,...) 13 | { 14 | va_list ap; 15 | 16 | va_start(ap,fmt); 17 | vprintf(fmt,ap); 18 | va_end(ap); 19 | } 20 | 21 | int init_logfile(char *filename) 22 | { 23 | logfile_fd = open(filename,O_RDWR|O_CREAT|O_APPEND,0666); 24 | if(logfile_fd < 0) { 25 | printf("open logfile failed\n"); 26 | return -1; 27 | } 28 | 29 | return 0; 30 | } 31 | 32 | int logfile(char *file,int line,char *msg) 33 | { 34 | char buff[256]; 35 | 36 | if(logfile_fd < 0) return -1; 37 | 38 | snprintf(buff,256,"%s:%d %s\n",file,line,msg); 39 | write(logfile_fd,buff,strlen(buff)); 40 | 41 | return 0; 42 | } 43 | -------------------------------------------------------------------------------- /BitTorrent/log.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/log.h -------------------------------------------------------------------------------- /BitTorrent/log.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/log.o -------------------------------------------------------------------------------- /BitTorrent/main.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/main.c -------------------------------------------------------------------------------- /BitTorrent/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/main.o -------------------------------------------------------------------------------- /BitTorrent/message.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/message.c -------------------------------------------------------------------------------- /BitTorrent/message.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/message.h -------------------------------------------------------------------------------- /BitTorrent/message.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/message.o -------------------------------------------------------------------------------- /BitTorrent/parse_metafile.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/parse_metafile.c -------------------------------------------------------------------------------- /BitTorrent/parse_metafile.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/parse_metafile.h -------------------------------------------------------------------------------- /BitTorrent/parse_metafile.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/parse_metafile.o -------------------------------------------------------------------------------- /BitTorrent/peer.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/peer.c -------------------------------------------------------------------------------- /BitTorrent/peer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/peer.h -------------------------------------------------------------------------------- /BitTorrent/peer.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/peer.o -------------------------------------------------------------------------------- /BitTorrent/policy.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/policy.c -------------------------------------------------------------------------------- /BitTorrent/policy.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/policy.h -------------------------------------------------------------------------------- /BitTorrent/policy.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/policy.o -------------------------------------------------------------------------------- /BitTorrent/sha1.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "sha1.h" 4 | 5 | #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) 6 | 7 | /* blk0() and blk() perform the initial expand. */ 8 | /* I got the idea of expanding during the round function from SSLeay */ 9 | #if (defined(BYTE_ORDER) && BYTE_ORDER==LITTLE_ENDIAN) || (!defined(BYTE_ORDER) && defined(LITTLE_ENDIAN)) 10 | #define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ 11 | |(rol(block->l[i],8)&0x00FF00FF)) 12 | #else 13 | #define blk0(i) block->l[i] 14 | #endif 15 | #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ 16 | ^block->l[(i+2)&15]^block->l[i&15],1)) 17 | 18 | /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ 19 | #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); 20 | #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); 21 | #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); 22 | #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); 23 | #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); 24 | 25 | 26 | /* Hash a single 512-bit block. This is the core of the algorithm. */ 27 | 28 | void SHA1Transform(unsigned long state[5], unsigned char buffer[64]) 29 | { 30 | unsigned long a, b, c, d, e; 31 | typedef union { 32 | unsigned char c[64]; 33 | unsigned long l[16]; 34 | } CHAR64LONG16; 35 | CHAR64LONG16* block; 36 | #ifdef SHA1HANDSOFF 37 | static unsigned char workspace[64]; 38 | block = (CHAR64LONG16*)workspace; 39 | memcpy(block, buffer, 64); 40 | #else 41 | block = (CHAR64LONG16*)buffer; 42 | #endif 43 | /* Copy context->state[] to working vars */ 44 | a = state[0]; 45 | b = state[1]; 46 | c = state[2]; 47 | d = state[3]; 48 | e = state[4]; 49 | /* 4 rounds of 20 operations each. Loop unrolled. */ 50 | R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); 51 | R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); 52 | R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); 53 | R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); 54 | R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); 55 | R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); 56 | R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); 57 | R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); 58 | R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); 59 | R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); 60 | R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); 61 | R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); 62 | R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); 63 | R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); 64 | R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); 65 | R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); 66 | R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); 67 | R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); 68 | R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); 69 | R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); 70 | /* Add the working vars back into context.state[] */ 71 | state[0] += a; 72 | state[1] += b; 73 | state[2] += c; 74 | state[3] += d; 75 | state[4] += e; 76 | /* Wipe variables */ 77 | a = b = c = d = e = 0; 78 | } 79 | 80 | 81 | /* SHA1Init - Initialize new context */ 82 | 83 | void SHA1Init(SHA1_CTX* context) 84 | { 85 | /* SHA1 initialization constants */ 86 | context->state[0] = 0x67452301; 87 | context->state[1] = 0xEFCDAB89; 88 | context->state[2] = 0x98BADCFE; 89 | context->state[3] = 0x10325476; 90 | context->state[4] = 0xC3D2E1F0; 91 | context->count[0] = context->count[1] = 0; 92 | } 93 | 94 | 95 | /* Run your data through this. */ 96 | 97 | void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) 98 | { 99 | unsigned int i, j; 100 | 101 | j = (context->count[0] >> 3) & 63; 102 | if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; 103 | context->count[1] += (len >> 29); 104 | if ((j + len) > 63) { 105 | memcpy(&context->buffer[j], data, (i = 64-j)); 106 | SHA1Transform(context->state, context->buffer); 107 | for ( ; i + 63 < len; i += 64) { 108 | SHA1Transform(context->state, &data[i]); 109 | } 110 | j = 0; 111 | } 112 | else i = 0; 113 | memcpy(&context->buffer[j], &data[i], len - i); 114 | } 115 | 116 | 117 | /* Add padding and return the message digest. */ 118 | 119 | void SHA1Final(unsigned char digest[20], SHA1_CTX* context) 120 | { 121 | unsigned long i, j; 122 | unsigned char finalcount[8]; 123 | 124 | for (i = 0; i < 8; i++) { 125 | finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] 126 | >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ 127 | } 128 | SHA1Update(context, (unsigned char *)"\200", 1); 129 | while ((context->count[0] & 504) != 448) { 130 | SHA1Update(context, (unsigned char *)"\0", 1); 131 | } 132 | SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ 133 | for (i = 0; i < 20; i++) { 134 | digest[i] = (unsigned char) 135 | ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); 136 | } 137 | /* Wipe variables */ 138 | i = j = 0; 139 | memset(context->buffer, 0, 64); 140 | memset(context->state, 0, 20); 141 | memset(context->count, 0, 8); 142 | memset(&finalcount, 0, 8); 143 | #ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ 144 | SHA1Transform(context->state, context->buffer); 145 | #endif 146 | } 147 | -------------------------------------------------------------------------------- /BitTorrent/sha1.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/sha1.h -------------------------------------------------------------------------------- /BitTorrent/sha1.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/sha1.o -------------------------------------------------------------------------------- /BitTorrent/signal_hander.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/signal_hander.c -------------------------------------------------------------------------------- /BitTorrent/signal_hander.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/signal_hander.h -------------------------------------------------------------------------------- /BitTorrent/signal_hander.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/signal_hander.o -------------------------------------------------------------------------------- /BitTorrent/tags: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/tags -------------------------------------------------------------------------------- /BitTorrent/torrent.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/torrent.c -------------------------------------------------------------------------------- /BitTorrent/torrent.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/torrent.h -------------------------------------------------------------------------------- /BitTorrent/torrent.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/torrent.o -------------------------------------------------------------------------------- /BitTorrent/tracker.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/tracker.c -------------------------------------------------------------------------------- /BitTorrent/tracker.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/tracker.h -------------------------------------------------------------------------------- /BitTorrent/tracker.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/tracker.o -------------------------------------------------------------------------------- /BitTorrent/ttorrent: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drusong/BitTorrent/32b215431791d95ee5eaa141ed7fd12263fda1ae/BitTorrent/ttorrent -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | BitTorrent 2 | ========== 3 | 4 | BitTorrent protocol in C 5 | most codes written by other people 6 | --------------------------------------------------------------------------------