-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.c
101 lines (86 loc) · 2.72 KB
/
client.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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#define BUFSIZE 512
int main(int argc, char **argv) {
int s, sfd, r;
struct addrinfo hints;
struct addrinfo *result, *rp;
char buf[BUFSIZE], *pt;
ssize_t nread, nwrite;
if (argc != 3) {
printf("Usage: %s nom_machine_distante port_serveur\n", argv[0]);
exit(EXIT_FAILURE);
}
/*
* Obtention de l'adresse IP du distant, a partir de son nom par
* consultation du fichier /etc/hosts ou de la base hosts des NIS
* ou du DNS (Domain Name Service)
* cf. man getaddrinfo(3)
*/
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; /* IPv4 ou IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Stream socket */
hints.ai_flags = 0;
hints.ai_protocol = 0; /* Any protocol */
s = getaddrinfo(argv[1], argv[2], &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
/* getaddrinfo() retourne une liste de structures d'adresses.
On essaie chaque adresse jusqu'a ce que connect(2) reussisse.
Si socket(2) (ou connect(2)) echoue, on (ferme la socket et on)
essaie l'adresse suivante. cf man getaddrinfo(3) */
for (rp = result; rp != NULL; rp = rp->ai_next) {
/* Ouverture de la socket */
sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
if (sfd == -1)
continue;
/* Connexion au distant */
r = connect(sfd, rp->ai_addr, rp->ai_addrlen);
if (r != -1)
break; /* Succes */
close(sfd);
}
if (rp == NULL) { /* Aucune adresse valide */
perror("connect");
exit(EXIT_FAILURE);
}
freeaddrinfo(result); /* Plus besoin */
/* Dans ce qui suit, n'oubliez pas de tester le code de retour des
* fonctions utilisees et d'emettre un message d'erreur avec perror(),
* puis de sortir avec exit(). */
/* Boucle de communication */
for (;;) {
/* Lecture socket */
nread = read(sfd, buf, BUFSIZE);
if (nread == 0) {
printf("Connexion rompue\n");
exit(EXIT_SUCCESS);
} else if (nread < 0) {
perror("read");
exit(EXIT_FAILURE);
}
buf[nread] = '\0';
/* Affichage ecran du message lu sur la socket */
printf("Message recu '%s'", buf);
/* Lecture clavier. Si on tape <Control-D>, gets() rend NULL
* <Control-D> symbolise la fin de fichier, ici la terminaison
* du client */
pt = fgets(buf, BUFSIZE, stdin);
if (pt == NULL) {
printf("Sortie du client\n");
exit(EXIT_SUCCESS);
}
nwrite = write(sfd, buf, strlen(buf));
if (nwrite < 0) {
perror("write");
exit(EXIT_FAILURE);
}
}
}