heck yea
This commit is contained in:
File diff suppressed because it is too large
Load Diff
BIN
A4/src/cascade
BIN
A4/src/cascade
Binary file not shown.
118
A4/src/cascade.c
118
A4/src/cascade.c
@ -22,6 +22,9 @@ char tracker_port[PORT_LEN];
|
|||||||
char my_ip[IP_LEN];
|
char my_ip[IP_LEN];
|
||||||
char my_port[PORT_LEN];
|
char my_port[PORT_LEN];
|
||||||
|
|
||||||
|
csc_file_t* cascade_files[64];
|
||||||
|
int cascade_amount;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Frees global resources that are malloc'ed during peer downloads.
|
* Frees global resources that are malloc'ed during peer downloads.
|
||||||
*/
|
*/
|
||||||
@ -498,27 +501,105 @@ int send_tracker_request(csc_peer_t** peers, uint8_t hash[32], int command)
|
|||||||
|
|
||||||
void service_block_request(void* arg) {
|
void service_block_request(void* arg) {
|
||||||
block_request_t* request = (block_request_t*)arg;
|
block_request_t* request = (block_request_t*)arg;
|
||||||
printf("servicing block request for %s\n",request->casc_file->outputfile);
|
printf("servicing block request.\n");
|
||||||
|
|
||||||
char request_header[HEADER_SIZE];
|
|
||||||
memcpy(request_header, request->request, HEADER_SIZE);
|
|
||||||
|
|
||||||
if (!memcmp(request_header, "CASCADE1",8)) {
|
char request_header[32];
|
||||||
// send error
|
memcpy(request_header, request->request, 32);
|
||||||
|
|
||||||
|
if (memcmp(request_header, "CASCADE1", 8) != 0) {
|
||||||
|
char response[9];
|
||||||
|
response[0] = 4;
|
||||||
|
for (int j = 1 ; j < 9; j++) {
|
||||||
|
response[j] = 0;
|
||||||
|
}
|
||||||
|
Rio_writen(request->socket,&response,9);
|
||||||
close(request->socket);
|
close(request->socket);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!memcmp(request_header[8], 0, 16)) {
|
for (int i = 8;i<16;i++) {
|
||||||
// send error
|
if ((int)request_header[i] != 0) {
|
||||||
|
char response[9];
|
||||||
|
response[0] = 4;
|
||||||
|
for (int j = 1 ; j < 9; j++) {
|
||||||
|
response[j] = 0;
|
||||||
|
}
|
||||||
|
Rio_writen(request->socket,&response,9);
|
||||||
|
close(request->socket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t block_number = be64toh(*((unsigned long long*)&request_header[24]));
|
||||||
|
|
||||||
|
unsigned char hash[32];
|
||||||
|
memcpy(hash, &(request->request[32]), 32);
|
||||||
|
csc_file_t* casc_file = NULL;
|
||||||
|
|
||||||
|
for (int i = 0; i < cascade_amount; i++){
|
||||||
|
if (memcmp(cascade_files[i]->cascadehash,hash,32) == 0) {
|
||||||
|
casc_file = cascade_files[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (casc_file == NULL) {
|
||||||
|
char response[9];
|
||||||
|
response[0] = 1;
|
||||||
|
for (int j = 1 ; j < 9; j++) {
|
||||||
|
response[j] = 0;
|
||||||
|
}
|
||||||
|
Rio_writen(request->socket,&response,9);
|
||||||
close(request->socket);
|
close(request->socket);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (block_number >= casc_file->blockcount) {
|
||||||
|
char response[9];
|
||||||
|
response[0] = 3;
|
||||||
|
for (int j = 1 ; j < 9; j++) {
|
||||||
|
response[j] = 0;
|
||||||
|
}
|
||||||
|
Rio_writen(request->socket,&response,9);
|
||||||
|
close(request->socket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
csc_block_t* block = (&casc_file->blocks[block_number]);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&casc_file->mutex);
|
||||||
|
|
||||||
|
if (!block->completed) {
|
||||||
|
char response[9];
|
||||||
|
response[0] = 2;
|
||||||
|
for (int j = 1 ; j < 9; j++) {
|
||||||
|
response[j] = 0;
|
||||||
|
}
|
||||||
|
Rio_writen(request->socket,&response,9);
|
||||||
|
pthread_mutex_unlock(&casc_file->mutex);
|
||||||
|
close(request->socket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE* fp = fopen(casc_file->outputfile, "rb+");
|
||||||
|
fseek(fp, block->offset, SEEK_SET);
|
||||||
|
char buffer[block->length];
|
||||||
|
fread(&buffer,1,block->length,fp);
|
||||||
|
fclose(fp);
|
||||||
|
pthread_mutex_unlock(&casc_file->mutex);
|
||||||
|
char response[9 + block->length];
|
||||||
|
response[0] = 0;
|
||||||
|
char* block_length = be64toh(block->length);
|
||||||
|
memcpy(&response[1],&block_length,8);
|
||||||
|
memcpy(&response[9],buffer,block->length);
|
||||||
|
|
||||||
|
Rio_writen(request->socket, &response, 9+block->length);
|
||||||
|
|
||||||
|
close(request->socket);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_mt(void* arg) {
|
void server_mt() {
|
||||||
csc_file_t* casc_file = (csc_file_t*)arg;
|
|
||||||
char rio_buf[64];
|
char rio_buf[64];
|
||||||
|
|
||||||
int socket = open_listenfd(my_port);
|
int socket = open_listenfd(my_port);
|
||||||
@ -529,17 +610,17 @@ void server_mt(void* arg) {
|
|||||||
rio_t rio;
|
rio_t rio;
|
||||||
int new_socket = Accept(socket, peer_address, &address_length);
|
int new_socket = Accept(socket, peer_address, &address_length);
|
||||||
Rio_readinitb(&rio, new_socket);
|
Rio_readinitb(&rio, new_socket);
|
||||||
Rio_readnb(&rio, rio_buf, MAXLINE);
|
Rio_readnb(&rio, rio_buf, 64);
|
||||||
|
|
||||||
pthread_t request_handler;
|
pthread_t request_handler;
|
||||||
block_request_t* request = malloc(sizeof(block_request_t));
|
block_request_t* request = malloc(sizeof(block_request_t));
|
||||||
memcpy(request->request,rio_buf,64);
|
memcpy(request->request,rio_buf,64);
|
||||||
request->peer_address = peer_address;
|
request->peer_address = peer_address;
|
||||||
request->casc_file = casc_file;
|
|
||||||
request->rio = rio;
|
request->rio = rio;
|
||||||
request->socket = new_socket;
|
request->socket = new_socket;
|
||||||
|
|
||||||
pthread_create(&request_handler, NULL, service_block_request, (void*)request);
|
pthread_create(&request_handler, NULL, service_block_request, (void*)request);
|
||||||
|
//pthread_join(&request_handler, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -582,13 +663,16 @@ void client_mt(void* arg) {
|
|||||||
|
|
||||||
for (int i=0; i<uncomp_count; i++)
|
for (int i=0; i<uncomp_count; i++)
|
||||||
{
|
{
|
||||||
|
pthread_mutex_lock(&casc_file->mutex);
|
||||||
get_block(queue[i], peer, casc_file->cascadehash, casc_file->outputfile);
|
get_block(queue[i], peer, casc_file->cascadehash, casc_file->outputfile);
|
||||||
|
pthread_mutex_unlock(&casc_file->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
pthread_mutex_lock(&casc_file->mutex);
|
||||||
casc_file = check_blocks(casc_file);
|
casc_file = check_blocks(casc_file);
|
||||||
|
pthread_mutex_unlock(&casc_file->mutex);
|
||||||
|
|
||||||
check_blocks(casc_file);
|
|
||||||
if (!casc_file->completed) {
|
if (!casc_file->completed) {
|
||||||
send_tracker_request(&(casc_file->peers), casc_file->cascadehash,1);
|
send_tracker_request(&(casc_file->peers), casc_file->cascadehash,1);
|
||||||
}
|
}
|
||||||
@ -611,6 +695,9 @@ void start_peer(char* cascade_file){
|
|||||||
csc_file_t *casc_file;
|
csc_file_t *casc_file;
|
||||||
casc_file = csc_parse_file(cascade_file);
|
casc_file = csc_parse_file(cascade_file);
|
||||||
|
|
||||||
|
cascade_files[cascade_amount] = casc_file;
|
||||||
|
cascade_amount++;
|
||||||
|
|
||||||
// start client and server on separate threads
|
// start client and server on separate threads
|
||||||
pthread_t client;
|
pthread_t client;
|
||||||
|
|
||||||
@ -620,7 +707,6 @@ void start_peer(char* cascade_file){
|
|||||||
|
|
||||||
|
|
||||||
pthread_create(&client, NULL, client_mt, (void*)casc_file);
|
pthread_create(&client, NULL, client_mt, (void*)casc_file);
|
||||||
pthread_join(client, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -685,12 +771,14 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_t server;
|
pthread_t server;
|
||||||
pthread_create(&server, NULL, server_mt, (void*)casc_file);
|
pthread_create(&server, NULL, server_mt, NULL);
|
||||||
|
|
||||||
for (int j=0; j<casc_count; j++)
|
for (int j=0; j<casc_count; j++)
|
||||||
{
|
{
|
||||||
start_peer(cascade_files[j]);
|
start_peer(cascade_files[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_join(server, NULL);
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,6 @@ typedef struct csc_file {
|
|||||||
|
|
||||||
typedef struct block_request {
|
typedef struct block_request {
|
||||||
char request[64];
|
char request[64];
|
||||||
csc_file_t* casc_file;
|
|
||||||
struct sockaddr* peer_address;
|
struct sockaddr* peer_address;
|
||||||
rio_t rio;
|
rio_t rio;
|
||||||
int socket;
|
int socket;
|
||||||
|
0
A4/src/tests/shakespeare.1mib.txt
Normal file
0
A4/src/tests/shakespeare.1mib.txt
Normal file
Reference in New Issue
Block a user