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 : 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;
}
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
 
#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
 ./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.