Bonjour,
Je viens de me lancer dans la programmation réseau, notamment dans la conception des sockets. J'ai un os vista où j'ai virtualisé ubuntu via une vbox. Donc je code mes sockets sur linux (virtualisé). Cependant tous les codes compilent sans souci et j'arrive à les lancer. Mais il ne se passe rien du tout. Le serveur tourne bien et attend la requête du client. Et le client envoie la requête au serveur mais a priori le serveur de la reçoit pas. Voici les codes:
CLIENT
et le 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 #include <sys/socket.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <string.h> #include <netdb.h> #include <unistd.h> #define MYPORT 4950 #define MAXBUFLEN 1000 //fonction gestion des erreur void erreur(char *msg) { printf(msg); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { //Variables int idSocket, idSendto, idRecv; struct sockaddr_in addr; struct hostent *he; char buf[MAXBUFLEN]; socklen_t addr_len; if(argc != 3) erreur("nbr d'argument de la fonction doit etre egal a 3\n"); addr_len = sizeof(struct sockaddr); // Récupérer l'adresse ip du serveur if ((he=gethostbyname(argv[1]))==NULL) { herror("gethostbyname du client\n"); exit(EXIT_FAILURE); } //création de la socket IPV4 sur UDP if((idSocket=socket(PF_INET, SOCK_DGRAM, 0))==-1) erreur("creation socket"); fprintf(stderr, "client cree la socket ok\n"); //Initialisation de l'adresse destination addr.sin_family = AF_INET; // définit le domaine soit IPV4 addr.sin_port = htons(MYPORT); //Conversion du port où envoyer addr.sin_addr = *((struct in_addr*) he->h_addr); //affecte l'addr du dest au format struct bzero(&addr.sin_zero, 8); //sendto idSendto = sendto(idSocket, argv[2], strlen(argv[2]), 0, (struct sockaddr *)&addr, addr_len); fprintf(stderr, "client envoie le message\n"); //Terminer par controle if(idSendto == -1) { perror("sendto"); exit(EXIT_FAILURE); } fprintf(stderr, "client en attente de reponse\n"); //attente de la réponse du serveur idRecv = recvfrom(idSocket, buf, MAXBUFLEN, 0, (struct sockaddr *)&addr, &addr_len); if(idRecv == -1) { perror("recvfrom client\n"); exit(EXIT_FAILURE); } //fermeture close(idSocket); return EXIT_SUCCESS; }
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 #include <sys/socket.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <string.h> #include <netdb.h> #include <unistd.h> #define MYPORT 4950 #define MAXBUFLEN 1000 //fonction gestion des erreur void erreur(char *msg) { printf(msg); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in srv_addr; //addr serveur struct sockaddr_in clt_addr; //addr client int numbytes, bind_res; char buf[MAXBUFLEN]; socklen_t addr_len; //Créer Socket if((sockfd=socket(AF_INET, SOCK_DGRAM, 0)) == -1) erreur("socket serveur\n"); fprintf(stderr, "serveur cree la socket ok\n"); //Associer un numero au port //Serveur qui se caractérise lui même srv_addr.sin_family = AF_INET; srv_addr.sin_port = htons(MYPORT); srv_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(srv_addr.sin_zero), 8); printf("connexion au port %d\n", MYPORT); do { bind_res=bind(sockfd, (struct sockaddr *)&srv_addr, sizeof(struct sockaddr)); if(bind_res==-1) { putchar('.'); fflush(stdout); usleep(1000); } } while(bind_res == -1); addr_len = sizeof(struct sockaddr); //boucle infinie fprintf(stderr, "serveur entre ds la boucle d'attente\n"); while(1) { numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, (struct sockaddr *)&clt_addr, &addr_len); if(numbytes==-1) erreur("recvfrom serveur\n"); buf[numbytes] = '\0'; //ajout du caractère de fin printf(buf); } return EXIT_SUCCESS; }
Je lance le serveur en premier en faisant:
et le client en faisant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part ./serveur
Voilà le résultat est décrit plus haut. Ca fait un moment que je cherche la solution sur le net et je ne trouve pas l'erreur. Et du coup je me demande si le fait de virtualiser ubuntu n'y est pas pour quelque chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ./client localhost helloword
Merci de votre aide.
Partager