98 lines
3.5 KiB
C
98 lines
3.5 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <sys/socket.h>
|
|
#include <arpa/inet.h>
|
|
#include <unistd.h>
|
|
#include <netdb.h>
|
|
#include <errno.h>
|
|
#include <signal.h>
|
|
|
|
#define SERVER_IP_ADDRESS "149.165.171.19"
|
|
#define SERVER_PORT 60019
|
|
|
|
#define HEADER_SIZE 4
|
|
#define CHUNK_SIZE 1024
|
|
#define TOTAL_CHUNKS 1024
|
|
|
|
#define AWK_BUFFER_SIZE 1024
|
|
|
|
int send_size, recv_size;
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int socket_desc, c, read_size; // socket and such
|
|
struct sockaddr_in server, client; // one for server one for client address info
|
|
|
|
char client_message[HEADER_SIZE + AWK_BUFFER_SIZE]; // Buffer (entire AWK buffer + requested chunk)
|
|
socket_desc = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
|
printf("SETUP: Socket Created\n");
|
|
|
|
server.sin_family = AF_INET;
|
|
server.sin_port = htons(SERVER_PORT);
|
|
server.sin_addr.s_addr = INADDR_ANY;
|
|
//inet_pton(AF_INET, SERVER_IP_ADDRESS, &(server.sin_addr));
|
|
|
|
bind(socket_desc, (struct sockaddr *)&server, sizeof(server));
|
|
printf("SETUP: Bind Completed \n\n");
|
|
|
|
c = sizeof(struct sockaddr_in);
|
|
|
|
// Start waiting for any messages inbound
|
|
FILE *file = fopen("ugbits.txt", "r");
|
|
while (1)
|
|
{
|
|
recv_size = recvfrom(socket_desc, client_message, HEADER_SIZE + AWK_BUFFER_SIZE, 0, (struct sockaddr *)&client, (socklen_t *)&c);
|
|
if (recv_size < 0)
|
|
{
|
|
perror("Receive Failed");
|
|
continue;
|
|
}
|
|
|
|
client_message[recv_size] = '\0';
|
|
|
|
char response[1025];
|
|
if (strncmp(client_message, "INI", 3) == 0) {
|
|
printf("Initial Send Request Received\n");
|
|
|
|
char buffer[CHUNK_SIZE];
|
|
int chunk_number = 1;
|
|
size_t bytes_read;
|
|
|
|
fseek(file, 0, SEEK_SET); // Reset file pointer to beginning
|
|
for (int i = 0; i < TOTAL_CHUNKS; i++) {
|
|
bytes_read = fread(buffer, 1, CHUNK_SIZE, file);
|
|
|
|
char chunk_response[HEADER_SIZE + CHUNK_SIZE];
|
|
snprintf(chunk_response, HEADER_SIZE + 1, "%04d", chunk_number);
|
|
memcpy(chunk_response + HEADER_SIZE, buffer, bytes_read);
|
|
|
|
send_size = sendto(socket_desc, chunk_response, HEADER_SIZE + bytes_read, 0, (struct sockaddr *)&client, c);
|
|
// printf("Sent chunk %d (%ld bytes)\n", chunk_number, bytes_read);
|
|
chunk_number++;
|
|
}
|
|
} else if (strncmp(client_message,"REQ", 3) == 0) {
|
|
char ack_buffer[AWK_BUFFER_SIZE];
|
|
memcpy(ack_buffer, client_message + HEADER_SIZE, AWK_BUFFER_SIZE);
|
|
printf("Retransmit Request Received\n");
|
|
|
|
for (int i = 1; i <= TOTAL_CHUNKS; i++) {
|
|
if (ack_buffer[i] != 1) {
|
|
fseek(file, (i - 1) * CHUNK_SIZE, SEEK_SET);
|
|
|
|
char buffer[CHUNK_SIZE];
|
|
size_t bytes_read = fread(buffer, 1, CHUNK_SIZE, file);
|
|
|
|
char chunk_response[HEADER_SIZE + CHUNK_SIZE];
|
|
snprintf(chunk_response, HEADER_SIZE + 1, "%04d", i);
|
|
memcpy(chunk_response + HEADER_SIZE, buffer, bytes_read);
|
|
|
|
send_size = sendto(socket_desc, chunk_response, HEADER_SIZE + bytes_read, 0, (struct sockaddr *)&client, c);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fclose(file);
|
|
close(socket_desc);
|
|
return 0;
|
|
}
|