-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsocket.c
executable file
·111 lines (94 loc) · 2.1 KB
/
socket.c
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
#include "headers/socket.h"
/* Traitement du signal passé en paramètre */
void traitement_signal(int sig)
{
int status;
if (sig == SIGCHLD) {
while (waitpid(-1, &status, WNOHANG) > 0)
;
}
}
/* Initialise les signaux des processus */
void initialiser_signaux(void)
{
struct sigaction sa;
sa.sa_handler = traitement_signal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1)
{
perror("sigaction(SIGCHLD)");
}
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
{
perror("signal");
}
}
/* Attend la connexion d'un utilisateur et retourne la socket client */
int ecouter_connexion(int socket_serveur)
{
int pid;
int socket_client;
/* Accepte une connexion */
socket_client = accept(socket_serveur, NULL, NULL);
if (socket_client == -1)
{
perror("accept");
return -1;
}
/* Création d'un client (processus fils)*/
pid = fork();
if (pid == -1)
{
perror("fork");
return -1;
}
else if (pid > 0)
{
close(socket_client);
return 0;
}
else
{
/* Notification de connexion pour le serveur */
printf("Connexion d'un client... ID: %d\n", getpid());
}
return socket_client;
}
/* Crée un serveur et retourne sa socket */
int creer_serveur(int port)
{
int optval = 1;
int socket_serveur;
struct sockaddr_in saddr;
/* Création de la socket serveur */
socket_serveur = socket(AF_INET, SOCK_STREAM, 0);
if (socket_serveur == -1)
{
perror("socket_serveur");
exit(1);
}
/* Attachement de la socket serveur sur toutes les interfaces */
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = INADDR_ANY;
/* Activation de l'option SO_REUSEADDR */
if (setsockopt(socket_serveur, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1)
{
perror("Can not set SO_REUSEADDR option");
exit(1);
}
/* Configuration de la socket */
if (bind(socket_serveur, (struct sockaddr *)&saddr, sizeof(saddr)) == -1)
{
perror("bind socket_serveur");
exit(1);
}
/* Lancer l'attente de connexion */
if (listen(socket_serveur, 10) == -1)
{
perror("listen socket_serveur");
return -1;
}
return socket_serveur;
}