This commit is contained in:
2025-11-12 22:32:12 +00:00
parent d414da27ae
commit 20271b1cdc
2 changed files with 79 additions and 66 deletions
+58 -47
View File
@@ -6,10 +6,12 @@
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <unistd.h>
#define SERVER_IP_ADDRESS "149.165.171.19"
#define SERVER_PORT 60019
#define METHOD_VERSION 1
#define HEADER_SIZE 4
#define CHUNK_SIZE 1024
@@ -35,7 +37,8 @@ int main(int argc, char *argv[])
// Ack Buffer
char ack_buffer[TOTAL_CHUNKS];
for (int i = 0; i < TOTAL_CHUNKS; i++) {
for (int i = 0; i < TOTAL_CHUNKS; i++)
{
ack_buffer[i] = 0; // Initialize all to not received
}
@@ -43,68 +46,76 @@ int main(int argc, char *argv[])
char file_buffer[CHUNK_SIZE * TOTAL_CHUNKS];
FILE *file = fopen("received_ugbits.txt", "w");
printf("Listening for file chunks...\n");
// Set socket timeout to 5 seconds
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
setsockopt(socket_desc, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
// Listen for file messages from the server
listen_for_file:
while (1)
// Listen for file messages from the server
listen_for_file:
while (1)
{
char buffer[CHUNK_SIZE + HEADER_SIZE];
socklen_t server_len = sizeof(server);
int recv_size = recvfrom(socket_desc, buffer, CHUNK_SIZE + HEADER_SIZE, 0, (struct sockaddr *)&server, &server_len);
if (recv_size < 0)
{
char buffer[CHUNK_SIZE + HEADER_SIZE];
socklen_t server_len = sizeof(server);
int recv_size = recvfrom(socket_desc, buffer, CHUNK_SIZE + HEADER_SIZE, 0, (struct sockaddr *)&server, &server_len);
if (recv_size < 0) {
// Timeout occurred - no message received for 5 seconds
printf("No messages received for 5 seconds, stopping...\n");
break;
} else {
buffer[recv_size] = '\0';
char chunkNum[5];
strncpy(chunkNum, buffer, HEADER_SIZE);
chunkNum[HEADER_SIZE] = '\0';
// printf("Received Chunk: %s\n", chunkNum);
ack_buffer[atoi(chunkNum)] = 1; // Set buffer to RXed
// Timeout occurred - no message received for 5 seconds
printf("No messages received for 5 seconds, stopping...\n");
break;
}
else
{
buffer[recv_size] = '\0';
char chunkNum[5];
strncpy(chunkNum, buffer, HEADER_SIZE);
chunkNum[HEADER_SIZE] = '\0';
ack_buffer[atoi(chunkNum)] = 1; // Set buffer to RXed
if (METHOD_VERSION == 1) {
// Method 1: Write Chunk Directly to file
fseek(file, (atoi(chunkNum) - 1) * CHUNK_SIZE, SEEK_SET);
fwrite(buffer + HEADER_SIZE, 1, recv_size - HEADER_SIZE, file);
// Method 2: Store chunk in buffer var
// memcpy(file_buffer + (atoi(chunkNum) - 1) * CHUNK_SIZE, buffer + HEADER_SIZE, recv_size - HEADER_SIZE);
fseek(file, (atoi(chunkNum) - 1) * CHUNK_SIZE, SEEK_SET);
fwrite(buffer + HEADER_SIZE, 1, recv_size - HEADER_SIZE, file);
} else {
// Method 2: Store chunk in buffer var
memcpy(file_buffer + (atoi(chunkNum) - 1) * CHUNK_SIZE, buffer + HEADER_SIZE, recv_size - HEADER_SIZE);
}
}
}
// If any chunk has not been received, request missing chunks
// This is accomplished by sending the ack buffer back to the server
int totalMissing = 0;
for (int i = 1; i <= TOTAL_CHUNKS; i++) {
if (ack_buffer[i] != 1) {
totalMissing++;
}
}
// If any chunk has not been received, request missing chunks
// This is accomplished by sending the ack buffer back to the server
int totalMissing = 0;
if (totalMissing != 0) {
printf("Total missing chunks: %d, requesting retransmission...\n", totalMissing);
char request[TOTAL_CHUNKS + HEADER_SIZE];
snprintf(request, sizeof(request), "REQ");
memcpy(request + HEADER_SIZE, ack_buffer, TOTAL_CHUNKS);
sendto(socket_desc, request, strlen(request), 0, (struct sockaddr *)&server, sizeof(server));
goto listen_for_file;
for (int i = 1; i <= TOTAL_CHUNKS; i++)
{
if (ack_buffer[i] != 1)
{
totalMissing++;
}
}
if (totalMissing != 0)
{
printf("Total missing chunks: %d, requesting retransmission...\n", totalMissing);
char request[TOTAL_CHUNKS + HEADER_SIZE];
snprintf(request, sizeof(request), "REQ");
memcpy(request + HEADER_SIZE, ack_buffer, TOTAL_CHUNKS);
sendto(socket_desc, request, strlen(request), 0, (struct sockaddr *)&server, sizeof(server));
goto listen_for_file;
}
// If we made it here, the file must be complete.
printf("File transfer complete!\n");
// Method 2: Write entire buffer to file
// fwrite(file_buffer, 1, CHUNK_SIZE * TOTAL_CHUNKS, file);
if (METHOD_VERSION == 2) {
// Method 2: Write entire buffer to file
fwrite(file_buffer, 1, CHUNK_SIZE * TOTAL_CHUNKS, file);
}
fclose(file);
close(socket_desc);
+21 -19
View File
@@ -7,7 +7,6 @@
#include <errno.h>
#include <signal.h>
#define SERVER_IP_ADDRESS "149.165.171.19"
#define SERVER_PORT 60019
#define HEADER_SIZE 4
@@ -19,9 +18,9 @@
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
int socket_desc, 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);
@@ -30,12 +29,11 @@ int main(int argc, char *argv[])
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);
int c = sizeof(struct sockaddr_in);
// Start waiting for any messages inbound
FILE *file = fopen("ugbits.txt", "r");
@@ -49,43 +47,47 @@ int main(int argc, char *argv[])
}
client_message[recv_size] = '\0';
char response[1025];
if (strncmp(client_message, "INI", 3) == 0) {
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++) {
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) {
}
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) {
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);
}
}