Bonjour à tous.
Dans le cadre d'un travail de L3 à l'IUT d'Orsay, je dois créer un petit programme de réseau udp sous Linux. Le principe est simple : on utilise des sockets, y'a un client et un serveur, et on doit faire en sorte à ce que le message du client se retrouve dans le serveur. Rien de bien compliqué.
Seulement voilà. Mon serveur est fait, mon client est fait. Les deux compilent sans problème, mais y'a juste pas moyen de faire en sorte à ce que le message de mon client passe dans le terminal du serveur. La fonction sendto() semble refuser de marcher : je me prends mon vilain "echec sendto" en pleine face à chaque fois. Pourtant je n'ai juste aucun warnings dans la compilation de mon client.
Jetez donc un oeil au code :
client_udp.c
serveur_udp.c
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 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h> #define SIZE 100 #define PORT 9600 int main(int argc, char * argv[]) { struct hostent * hostname; struct sockaddr_in addrServ = {0}; int s ; if ((s= socket(AF_INET, SOCK_DGRAM, 0)) < 0) { fprintf(stderr, "Erreur de socket\n"); return -1; } if ((hostname = gethostbyname("localhost")) == NULL) { fprintf(stderr, "Host inconnu\n"); return -1; } addrServ.sin_family = AF_INET; addrServ.sin_port = htons(PORT); addrServ.sin_addr = *(struct in_addr *) hostname->h_addr; //bcopy(hostname->h_addr, addrServ.sin_addr.s_addr, hostname->h_length); char buff[SIZE]; int n; n = sprintf(buff, "Je suis un ananas !\n"); printf("%s", buff); if (sendto(s, buff, strlen(buff), 0, (struct sockaddr *)&hostname, sizeof(hostname)) < 0 ); { fprintf(stderr, "Echec sendto\n"); return -1; } close(s); return 0; }
Bref. Y'a pas moyen : mon serveur refuse de croire que mon client est un ananas...
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 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h> #define PORT 9600 int main(int argc, char * argv[]) { struct in_addr inad; inad.s_addr = htonl(0x7F000001); struct sockaddr_in addrServ = {0}; addrServ.sin_family = AF_INET; addrServ.sin_port = htons(PORT); addrServ.sin_addr = inad; struct in_addr inad2; inad2.s_addr = INADDR_ANY; struct sockaddr_in addrCli = {0}; addrCli.sin_family = AF_INET; addrCli.sin_port = htons(PORT); addrCli.sin_addr = inad2; int s ; if ((s= socket(PF_INET, SOCK_DGRAM, 0)) < 0) { fprintf(stderr, "Erreur de socket\n"); return -1; } //printf("IP = %s, Port = %u\n", addrServ.sin_addr, addrServ.sin_port); if (bind(s, (struct sockaddr *) &addrServ, sizeof(struct sockaddr_in)) < 0) { close(s); perror("Erreur bind\n"); return -1; } char buff[100]; while(1) { if (recvfrom(s, buff, sizeof(buff), 0, (struct sockaddr *) &addrCli, (socklen_t *) sizeof(addrCli)) != NULL) { write(s, buff, sizeof(buff)); printf("Oui client, vous etes un ananas.\n"); close(s); } } return 0; }
Un peu d'aide s'il vous plait ? :p
Partager