bon j'ai intégré set sockopt. ca marche toujours qu'une seule fois apres delog et relog. je sais pas ce que j'ai mal fait.
si tu as le temps de mater un peu le code (regarde au niveau du bind) merci beaucoup
___________________________________________________________
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h> // Gestion Fichier
#include <malloc.h> // Fonctions mémoire
#include <stdlib.h> // Fonctions mémoire
// ---------------- DECLARATION FONCTIONS
void Serveur(void); // Le Serveur
void Erreur(char *); // Erreur Fatale au Serveur
// ---------------- CONSTANTES + VARIABLES GLOBALES
#define FICHIER "source.txt" // Fichier Source
#define FICH_MAX_SIZE 10000 // Taille Maximum de Fichier
#define PORT_SERVEUR 4000 // Numéro Port du Socket Serveur (1 à 65535)
int sock; // La Socket
struct sockaddr_in sinfo; // Infos sur la Socket
int sinfosize; // Taille structure sinfo
FILE *fich; // Pointeur fichier Source
void *on;
// *********
// main
// *********
int main()
{
while(1) Serveur(); // Lancement du Serveur Jamais d'arrêt du Serveur
return 0; //fin du programme (jamais atteind !)
}
// *********
// Serveur
// *********
void Serveur(void)
{
int Etat; // Retour des commandes Socket
int ServeurON; // false => Fin Serveur , true => Serveur en route
char *buffer; // buffer memoire, va contenir le fichier
int TailleFichier; // Taille Fichier
// __________________________ CREATION SOCKET __________________________________________
sock=socket(AF_INET,SOCK_STREAM,0); // Tentative Creation Socket
if (sock==-1)
{
fprintf(stderr,"-------------ERREUR------------ Creation Socket Impossible !\n" );
exit(0);
}
fprintf(stderr,"Socket crée ! --------- OK\n" );
sinfo.sin_addr.s_addr = htonl(INADDR_ANY); // @IP Socket = @IP Ordinateur
sinfo.sin_family = AF_INET; // Protocole internet
sinfo.sin_port = htons(PORT_SERVEUR); // Port du Socket Serveur
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); // pour réutiliser l'adresse pour un bind ulterieur
// ________________________________ BIND _______________________________________________
Etat=bind(sock,(struct sockaddr *)&sinfo,sizeof(sinfo)); // Attache Socket
if (Etat==-1)
{
fprintf(stderr,"-----------ERREUR---------- Socket: Bind Impossible !\n" );
perror(bind);
close(sock);
exit(0);
}
fprintf(stderr,"Bind réussi ! -------- OK\n" );
// _____________________________ LISTEN ________________________________________________
Etat=listen(sock,0); // Mise en écoute Socket
if (Etat<0)
{
fprintf(stderr,"----------ERREUR----------- Socket: Ecoute Impossible !\n" );
close(sock);
exit(0);
}
fprintf(stderr,"Mise en écoute ------- OK\n" );
ServeurON=1; // Le Serveur à démarré
fprintf(stderr,"ServeurON mis à %d\n",ServeurON);
// _______________________ RESERVATION BUFFER MEMOIRE __________________________________
if ((buffer=(char *)malloc(FICH_MAX_SIZE))==NULL)
{
fprintf(stderr,"-----------ERREUR------------ Reservation Memoire Impossible !\n" );
close(sock);
exit(0);
}
fprintf(stderr,"Réservation mémoire -------- OK\n" );
// ______________________________________ BOUCLE SERVEUR _________________________________________________
while(ServeurON==1) // Boucle permanente tant que ServeurON=true
{
sinfosize = sizeof(sinfo); // Taille Structure sinfo
// _____________________________ ACCEPT
if((sock=accept(sock,(struct sockaddr *)&sinfo,&sinfosize))!= -1)
{
// OK LE SERVEUR A ACCEPTE LA CONNECTION CLIENT
fprintf(stderr,"CONNEXION ETABLIE ----------- OK\n" );
// ____________________________ FICHIER
if ((fich=fopen(FICHIER,"rb" ))==NULL)
{
fprintf(stderr,"----------ERREUR------- Ouverture Fichier Impossible !\n" );
close(sock);
exit(0);
}
fprintf(stderr,"Fichier %s ouvert ----------- OK\n",FICHIER);
TailleFichier=fread(buffer,1,FICH_MAX_SIZE,fich); // Lecture dans FICHIER
fprintf(stderr,"TailleFichier = %d\n",TailleFichier);
// ____________________________ SEND
if (send(sock,buffer,TailleFichier,0)<0)
{
fprintf(stderr,"----------ERREUR-------- Erreur send transmission du Serveur !\n" );
close(sock);
exit(0);
}
fprintf(stderr,"SEND ------------ OK\n" );
// ___________________________ CLOSE
fclose(fich); // Fermeture Fichier
ServeurON=-1;
fprintf(stderr,"ServeurON = %d\n",ServeurON);
} else { fprintf(stderr,"--------ERREUR------- CONNEXION BAAAD, ACCEPT FOIREUX !!!\n" ); }
}
// ________________________________________ FIN BOUCLE SERVEUR _________________________________________
free(buffer); // Libère mémoire
sleep(1000); // 1 secs d'attente => le client se deconnecte avant
close(sock); // Fermeture Socket
fprintf(stderr,"-------- FIN SERVEUR ---------" );
}