You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.3 KiB
89 lines
2.3 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <unistd.h>
|
|
|
|
#define BUFFER_SIZE 1024
|
|
|
|
void usage() {
|
|
fprintf(stderr, "Usage: serveur port fichier\n");
|
|
exit(1);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
if (argc != 3) {
|
|
fprintf(stderr, "Erreur : Nombre incorrect d'arguments !\n");
|
|
usage();
|
|
}
|
|
|
|
int port = atoi(argv[1]);
|
|
|
|
int serverSocket = socket(AF_INET6, SOCK_STREAM, 0);
|
|
if (serverSocket == -1) {
|
|
perror("Error creating server socket");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
struct sockaddr_in6 serverAddress;
|
|
memset(&serverAddress, 0, sizeof(serverAddress));
|
|
serverAddress.sin6_family = AF_INET6;
|
|
serverAddress.sin6_addr = in6addr_any;
|
|
serverAddress.sin6_port = htons(port);
|
|
|
|
if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) {
|
|
perror("Error binding server socket");
|
|
close(serverSocket);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
if (listen(serverSocket, 1) == -1) {
|
|
perror("Error listening on server socket");
|
|
close(serverSocket);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
printf("Server listening on port %d...\n", port);
|
|
|
|
while (1) {
|
|
int clientSocket = accept(serverSocket, NULL, NULL);
|
|
if (clientSocket == -1) {
|
|
perror("Error accepting client connection");
|
|
close(serverSocket);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
printf("Client connected. Transferring file...\n");
|
|
|
|
FILE *file = fopen(argv[2], "rb");
|
|
if (!file) {
|
|
perror("Error opening file for reading");
|
|
close(clientSocket);
|
|
continue; // Move on to the next client
|
|
}
|
|
|
|
// Send file content to client
|
|
unsigned char buffer[BUFFER_SIZE];
|
|
size_t bytesRead;
|
|
while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) != 0) {
|
|
if (send(clientSocket, buffer, bytesRead, 0) == -1) {
|
|
perror("Error sending file content to client");
|
|
fclose(file);
|
|
close(clientSocket);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
printf("File transfer complete.\n");
|
|
|
|
fclose(file);
|
|
close(clientSocket);
|
|
}
|
|
|
|
close(serverSocket);
|
|
|
|
return 0;
|
|
}
|