Programmation linux avec vbox
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
Code:
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;
} |
et le SERVEUR
Code:
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:
./client localhost helloword
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.
Merci de votre aide.