87 lines
2.8 KiB
C
87 lines
2.8 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 CHUNK_SIZE 8192
|
|
|
|
int send_size, recv_size;
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int socket_desc, client_sock, c, read_size; // sockets and such
|
|
struct sockaddr_in server, client; // one for listening one for connection with client(s)
|
|
char client_message[CHUNK_SIZE]; // Maximum size of the message buffer
|
|
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
|
|
client_sock = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
printf("Sockets Created\n");
|
|
|
|
server.sin_family = AF_INET;
|
|
server.sin_port = htons(10059);
|
|
inet_pton(AF_INET, "127.0.0.1", &(server.sin_addr));
|
|
|
|
if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
|
|
{
|
|
perror("Bind Failed"); // perror is a very helpful function for tracking down errors
|
|
return 1;
|
|
}
|
|
printf("Bind completed \n");
|
|
|
|
c = sizeof(struct sockaddr_in);
|
|
|
|
listen(socket_desc, 1);
|
|
|
|
printf("Waiting for incoming connections...\n");
|
|
|
|
// Start waiting for any connections inbound
|
|
while (1)
|
|
{
|
|
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c);
|
|
printf("\nClient Connected\n");
|
|
while (1)
|
|
{
|
|
recv_size = recv(client_sock, client_message, 2, 0);
|
|
long fileSize;
|
|
if (recv_size == 0)
|
|
{
|
|
printf("Client disconnected\n");
|
|
break;
|
|
}
|
|
client_message[recv_size] = '\0';
|
|
printf("Received %d bytes. Msg is %s \n", recv_size, client_message);
|
|
// Determine type of message
|
|
if (strncmp(client_message, "FS", 2) == 0)
|
|
{
|
|
// Send size of the file
|
|
FILE *fp = fopen("bits.txt", "rb");
|
|
fseek(fp, 0, SEEK_END);
|
|
fileSize = ftell(fp);
|
|
fclose(fp);
|
|
sprintf(client_message, "%ld|%d", fileSize, CHUNK_SIZE);
|
|
send_size = send(client_sock, client_message, strlen(client_message), 0);
|
|
}
|
|
else if (strncmp(client_message, "RX", 2) == 0)
|
|
{
|
|
// Client ready to receive file
|
|
FILE *fp = fopen("bits.txt", "rb");
|
|
for(int i = 0; i < fileSize; i += CHUNK_SIZE) {
|
|
char buffer[CHUNK_SIZE];
|
|
size_t bytesRead = fread(buffer, 1, CHUNK_SIZE, fp);
|
|
if (bytesRead > 0) {
|
|
send_size = send(client_sock, buffer, bytesRead, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
close(socket_desc);
|
|
close(client_sock);
|
|
return 0;
|
|
}
|