Bonjour à tous,
Je souhaiterai faire une manip pour savoir Combien de clients mon système va placer dans la file d’attente après qu’un serveur ait effectué un listen(..., 1) avant de refuser les connexions ?
Question 1 : comment dois-je faire pour saturer mon système de manière à trouer le nombre maximal de clients.
Question 2 : Je joins les codes client et serveur que j'utilise. Quand je compile j'ai une erreur sur le code serveur et je ne comprends pas pourquoi.
Question 3 : quelle commande dois-je appliquer pour savoir le nombre de clients que mon système met dans la file d'attente ?
Merci d'avance pour votre aide
Code serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /* serveur.c Repondre en synchrone aux demandes de connexion sur une socket. */ # include "sys. h" char * answersync(char * port, int (* fun)(int ) ) { struct addrinfo * info, * p; struct addrinfo indices; int fd, t; int toclient ; struct sockaddr fromaddr; unsigned int len = sizeof fromaddr; memset(&indices, 0, sizeof indices) ; indices. ai_flags = AI_PASSIVE; // accepter de toutes les machines indices. ai_family = AF_INET; // seulement IPv4 indices. ai_socktype = SOCK_STREAM; // seulement TCP t = getaddrinfo(0, port, &indices, &info); if ( t != 0) return "answer: cannot get info on port"; // Ouvrir la socket for(p = info; p != 0; p = p−>ai_next){ fd = socket(p−>ai_family, p−>ai_socktype, 0); // fabriquer la socket if ( fd >= 0) break; } if (p == 0) return "answer: pas moyen d'avoir une socket"; t = 1; // re−utiliser l ' adresse t = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &t, sizeof t); if ( t < 0){ perror("setsockopt"); fprintf (stderr, "answer: on continue quand meme\n"); } if (bind(fd, p−>ai_addr, p−>ai_addrlen) < 0){ // donne lui un role close( fd); return "answer: pas moyen de binder la socket"; } freeaddrinfo(info); t = listen ( fd, 1); // on veut des connexions par ici if ( t < 0){ close( fd); return "answer: pas moyen d'ecouter sur la socket"; } for(;;) { toclient = accept(fd, &fromaddr, &len); // accept if ( toclient < 0) return "answer: pas moyen d'accepter\n"; fun(toclient ) ; close( toclient ) ; } } # if DEBUG /* Un serveur d'echo pour tester */ int foo(int n){ char c; int t; printf( "J' ai un client \n"); while((t = read(n, &c, 1)) > 0) if (write(n, &c, 1) != 1){ perror("write") ; break; } if ( t < 0) perror("read"); printf( "Je n'ai plus ce client \n"); return 0; } int main(int ac, char * av[]) { char * p; p = answersync(av[1], foo); perror(p); return 1; } # endif /* DEBUG */
Code client :
Code sys.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /* client.c Renvoie une connexion vers un serveur, ou -1 */ # include "sys.h" static int alldigit(char * s) { for (; *s != 0; s++) if (!isdigit(*s)) return 0 ; return 1 ; } int dial(char * machine, char * port) { struct sockaddr_in socdesc ; struct servent * sp ; struct hostent * hp ; int s, t, nport ; /* transforme service et machine */ if (! alldigit(port)) { sp= getservbyname(port, "tcp") ; if (sp == NULL) return -1 ; nport= sp->s_port ; } else nport= htons(atoi(port)) ; hp= gethostbyname(machine) ; if (hp == 0) return -1 ; memset((char *)&socdesc, 0, sizeof socdesc) ; /* fabrique la structure server */ memcpy((char *)&socdesc.sin_addr, hp->h_addr, hp->h_length) ; socdesc.sin_family= hp->h_addrtype ; socdesc.sin_port= nport ; s= socket(AF_INET, SOCK_STREAM, 0) ; /* fabrique la socket */ if (s < 0) return -1; t = connect(s, (struct sockaddr *)&socdesc, sizeof socdesc); if (t < 0) return -1; else return s; } # if DEBUG main (int ac, char * av[]) { char buffer[512] ; int t, fd= dial(av[1], av[2]) ; while((t= read(0, buffer, sizeof buffer)) > 0) { write (fd, buffer, t) ; t= read(fd, buffer, sizeof buffer) ; printf("Recu %d octets en echo\n", t) ; write(1, buffer, t); } } # endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /* sys.h Inclure */ # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <stdio.h> # include <netdb.h> # include <unistd.h> # include <ctype.h> # include <stdlib.h> # include <signal.h> # include <string.h> # include <assert.h> int dial(char * host, char * port); // client char * answer(char * port, int (*fun)(int)); // serveur
Partager