1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <resolv.h>
using namespace std;
#define TAILLE_BUF 1000
#define LENGTH 512
int main()
{
/*** Declaration des fonction ***/
void TraitementSend(int connfd);
void TraitementRcv(int connfd);
/*** Declaration des variables ***/
int port;
int listenfd;
int connfd;
struct sockaddr_in servaddr;
/*** Code ***/
cout << "Entrer le port du serveur : ";
cin >> port;
if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket error");
exit(1);
}
bzero(&servaddr, sizeof(servaddr));//on met toute la structure a 0
//on remplit la structure avec l'ip du serveur et le num de son port
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY signifie que le serveur va accepter une connection client sur n'importe-quelle interface
servaddr.sin_port = htons(port);
//on lie le port du serveur au socket en remplissant la "internet socket
//adresse structure" et en appellant bind
if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
{
perror("bind error");
exit(1);
}
//avec listen, le socket est converti en listening socket (ecoute)
//sur lequel les demandes de connections vont etre acceptees par le Kernel
if (listen(listenfd, 1) < 0)
{
perror("listen error");
exit(1);
}
//accept retourne un "descripteur de connection" (connected descriptor) qui est
//utilise pour la communication avec le nouveau client. Un nouveau pour chaque client
if ((connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0)
{
perror("accept error");
exit(1);
}
TraitementRcv(connfd);
TraitementSend(connfd);
close(connfd);
return 0;
}
void TraitementRcv ( int connfd)
{
/*** Declaration des variables ***/
char buffer[256];
// bzero(buffer,256);
int n = 0;
char revbuf[LENGTH];
fgets(buffer,255,stdin);
// bzero(buffer,256);
int fr_block_sz = 0;
const char* fs_name = "basecloud.txt";
const char* fss_name = "intermediaireCloud.txt";
/*** Code ***/
n = read(connfd, buffer, 255);
if (n < 0) printf("Erreur de lecture de socket");
FILE* fr=fopen(fs_name, "a+");
FILE* inter=fopen(fss_name, "w");
if((fr == NULL) && (inter == NULL))
printf("Fichier %s et %s ne peuvent pas etre ouverts .\n", fs_name, fss_name);
else
{
bzero(revbuf, LENGTH);
while((fr_block_sz = recv(connfd, revbuf, LENGTH, 0)) > 0)
{
int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);
int write_inter = fwrite(revbuf, sizeof(char), fr_block_sz, inter);
if((write_sz < fr_block_sz) && (write_inter < fr_block_sz))
{
printf("impossible d'crire dans les 2 fichiers.\n");
}
bzero(revbuf, LENGTH);
if (fr_block_sz == 0 || fr_block_sz != 512)
{
break;
}
}
if(fr_block_sz < 0)
{
if (errno == EAGAIN)
{
printf("recv() timed out.\n");
}
else
{
fprintf(stderr, "recv() failed due to errno = %d\n", errno);
exit(1);
}
}
printf("fichier reçu de la part de client edge \n Bye!");
fclose(inter);
fclose(fr);
}
}
void TraitementSend (int connfd)
{
/**** Declaration des variables ****/
const char* fs_name = "intermediaireCloud.txt";
char sdbuf[LENGTH];
char buffer[256];
int n;
fgets(buffer,255,stdin);
int fs_block_sz;
/**** Code ****/
n = write(connfd,buffer, strlen(buffer));
if(n<0) printf("Erreur d'envoi");
printf("serveur cloud envoi le fichier %s au fog... ", fs_name);
FILE *fs = fopen(fs_name, "r");
if(fs == NULL)
{
printf("ERROR: le fichier %s n'est pas trouvé.\n", fs_name);
exit(1);
}
bzero(sdbuf, LENGTH); //Fonction qui définit les premiers n (LENGTH) octets de la zone à partir de "SDBUF" à zero (Octets contenant '\ 0')
while((fs_block_sz = fread(sdbuf, sizeof(char), LENGTH, fs)) > 0)
{
if(send(connfd, sdbuf, fs_block_sz, 0) < 0)
{
fprintf(stderr, "ERROR: impossible d'envoyer le fichier %s. (errno = %d)\n", fs_name, errno);
break;
}
bzero(sdbuf, LENGTH);
}
printf("Ok le fichier %s est envoyer au Fog \n", fs_name);
//}
fclose(fs);
close (connfd);
} |
Partager