crescentpserver

 avatar
unknown
plain_text
19 days ago
3.3 kB
1
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/stat.h>


#define BUFFER_SIZE 1024
#define MAX_FILENAME_LENGTH 256
#define MAX_FILES 10

void handle_client(int client_socket);
void transfer_files(int client_socket, const char* filename);
int file_count = 0;

int main() {
	int server_socket, client_socket;
	struct sockaddr_in server_addr, client_addr;
	socklen_t client_len = sizeof(client_addr);
	
	server_socket = socket(AF_INET, SOCK_STREAM, 0);
	if(server_socket == -1){
		perror("Socket creation failed\n");
		exit(EXIT_FAILURE);
		}
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = INADDR_ANY;
	server_addr.sin_port = htons(444);
	
	if(bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
		perror("Bind failed\n");
		exit(EXIT_FAILURE);
	}
	
	if(listen(server_socket, 5) < 0){
		perror("Listern failed\n");
		exit(EXIT_FAILURE);
	}
	
	printf("Server listening of port 444...\n");
	
	while(1){
		client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_len);
		if(client_socket < 0){
			perror("Accept Failed\n");
			exit(EXIT_FAILURE);
		}
		
		printf("New connection created\n");
		handle_client(client_socket);	
	
	}
	close(server_socket);
	return 0;
}

void handle_client(int client_socket){
	char buffer[BUFFER_SIZE];
	char* filenames[MAX_FILES];
	int file_bount = 0;
	
	while(1){
			memset(buffer, 0, BUFFER_SIZE);
			int bytes_recieved = recv(client_socket, buffer, BUFFER_SIZE - 1, 0);
			
			if(bytes_recieved <= 0) {
				break;
			}
			
			buffer[bytes_recieved] = '\0';
			printf("Received: %s\n", buffer);
			
			if(strncmp(buffer, "Send ", 5) == 0) {
				char* token = strtok(buffer + 5, ",");
				while(token != NULL && file_count < MAX_FILES) {
					filenames[file_count] = strdup(token);
					token = strtok(NULL, ",");
					file_count++;
			}
			
			for(int i = 0; i < file_count; i++) {
				transfer_files(client_socket, filenames[i]);
				free(filenames[i]);
			}
			
			file_count = 0;
		}
	}
}

void transfer_files(int client_socket, const char* filename) {
	char buffer[BUFFER_SIZE];
	int file_fd, bytes_read;
	struct sockaddr_in transfer_addr;
	int transfer_socket;
	
	transfer_socket = socket(AF_INET, SOCK_STREAM, 0);
	
	if(transfer_socket == -1){
		perror("Transfer socket creation failed\n");
		return;
	}
	
	memset(&transfer_addr, 0, sizeof(transfer_addr));
	transfer_addr.sin_family = AF_INET;
	transfer_addr.sin_addr.s_addr = inet_addr("192.168.2.4");
	
	transfer_addr.sin_port = htons(555);
	
	if(connect(transfer_socket, (struct sockaddr*)&transfer_addr, sizeof(transfer_addr)) < 0){
		perror("Transfer connection failed\n");
		close(transfer_socket);
		return;
	}
	
	file_fd = open(filename, O_RDONLY);
	if(file_fd == -1) {
		perror("file not found\n");
		close(transfer_socket);
		return;
	}
	
	while((bytes_read = read(file_fd, buffer, BUFFER_SIZE)) > 0) {
		send(transfer_socket, buffer, bytes_read, 0);
	}	
	
	close(file_fd);
	close(transfer_socket);
	printf("File %s transferred\n", filename);
	return;
}
	



















































Editor is loading...
Leave a Comment