89 lines
2.3 KiB
C
89 lines
2.3 KiB
C
/* déclaration des types de base */
|
|
#include <sys/types.h>
|
|
/* constantes relatives aux domaines, types et protocoles */
|
|
#include <sys/socket.h>
|
|
/* constantes et structures propres au domaine INTERNET */
|
|
#include <netinet/in.h>
|
|
/* structures retournées par les fonctions de gestion de la base de
|
|
données du réseau */
|
|
#include <netdb.h>
|
|
/* pour les entrées/sorties */
|
|
#include <stdio.h>
|
|
/* la lib standard */
|
|
#include <stdlib.h>
|
|
/* pour le fork */
|
|
#include <unistd.h>
|
|
|
|
void print_nb_connexions(int nb_connexions) {
|
|
if (nb_connexions == 1) {
|
|
printf("Nouvelle connexion, 1ere connexion\n");
|
|
} else if (nb_connexions == 2) {
|
|
printf("Nouvelle connexion, 2nd connexion\n");
|
|
} else {
|
|
printf("Nouvelle connexion, %deme connexion\n", nb_connexions);
|
|
}
|
|
printf("L'adresse du nombre de connexions est : %p\n", &nb_connexions);
|
|
}
|
|
|
|
|
|
int main(int argc, char * argv[])
|
|
{
|
|
if (argc != 2) {
|
|
printf("ERREUR : Usage : ./serveur N°Port\n");
|
|
exit(2);
|
|
}
|
|
|
|
// On crée le socket local
|
|
int sock = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (sock == -1) {
|
|
printf("ERREUR lors de la création du socket\n");
|
|
exit(1);
|
|
}
|
|
|
|
// On cree l'adresse du socket local
|
|
struct sockaddr_in addr_local;
|
|
int binder;
|
|
|
|
addr_local.sin_family = AF_INET;
|
|
addr_local.sin_port = atoi(argv[1]);
|
|
addr_local.sin_addr.s_addr = INADDR_ANY;
|
|
|
|
//On bind l'adresse du socket créee avec le socket local
|
|
binder = bind(sock,(struct sockaddr *) &addr_local, sizeof(struct sockaddr_in));
|
|
if (binder == -1){
|
|
printf("ERREUR lors du bind du socket\n");
|
|
exit(1);
|
|
}
|
|
|
|
//Initialisation file d'attente
|
|
listen(sock, 100);
|
|
|
|
// Variable de stockage de l'addresse emmeteur
|
|
struct sockaddr_in addr_em;
|
|
unsigned int longueur_addr_em = sizeof(struct sockaddr_in);
|
|
|
|
|
|
// On se met en état d'acceptation de connexion (et on crée un socket en passant)
|
|
int pid = 1;
|
|
int nb_connexions = 0;
|
|
while (pid != 0){
|
|
|
|
int sock_connexion = accept(sock, (struct sockaddr *)&addr_em, &longueur_addr_em);
|
|
nb_connexions++;
|
|
pid = fork();
|
|
|
|
if (pid == -1){
|
|
printf("ERREUR lors du fork\n");
|
|
exit(1);
|
|
} else if (pid == 0) {
|
|
if (sock_connexion == -1) {
|
|
printf("ERREUR lors de l'acceptation de la connexion\n");
|
|
exit(1);
|
|
} else {
|
|
print_nb_connexions(nb_connexions);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|