Salut !

Je fais actuellement un simple petit client serveur car je n'ai besoin d'envoyer que de petites informations d'un programme à l'autre et ce serait trop lourd d'utiliser un ORB pour faire cela.

J'ai donc décidé d'utiliser des sockets, et j'ai un tout peit problème que je ne comprend vraiment pas ... je lance mon serveur, et il attend la connexion ... je lance mon client et il me dit qu'il est connecté, mais mon serveur reste en attente de connexion et ne bouge pas de là ...

Voici mon code, est-ce que quelqu'un aurait une idée ?

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
89
90
91
92
93
94
95
#include <winsock2.h>
#include <iostream>
 
int main(int argc, char* argv[]){
 
  int attenteSocket;
  int acceptation;
  int sock;
  int bindS;
  int nb;
  char* clavier;
  int port;
  int lire;
  int i;
 
  char tampon[512];
 
  SOCKADDR_IN emetteur;
  SOCKADDR_IN hote;
  struct hostent* host;
 
  int longAddr;
 
  // Vérification du nombre de paramètres
  if(argc == 3){
    if (!strcmp(argv[1],"-port")) port = (int)argv[2];
	else port = 9999;
  } else {
    port = 9999;
  }
 
  WSADATA WSAData;
  WSAStartup(MAKEWORD(2,0), &WSAData);
 
  // Résolution DNS à partir du nom de la machine
  host = gethostbyname("localhost");
 
  //Initialisation de la structure sockaddr_in
  hote.sin_family = AF_INET;
  hote.sin_port = htons(port);
 
  memcpy(&hote.sin_addr,
	 host->h_addr,
	 host->h_length);
 
  for(int i=0; i<8; i++){
    hote.sin_zero[i] = 0;
  }  
 
  // Création du socket
  sock = socket(AF_INET, SOCK_STREAM, 0);
 
  // Test de la validité de la création du socket
  if(sock == -1){
    printf("Erreur à l'ouverture du socket\n");
    exit(-1);
  } 
 
  bindS = bind(sock, (SOCKADDR*)&hote, sizeof(hote));
 
  // Test de la validité du bind
  if(bindS == -1){
    printf("Erreur lors du bind du socket\n");
    exit(-1);
  } 
 
  printf("Socket créé et bindé\n");
 
  listen(sock,0);
  do{
    attenteSocket = listen(sock, 0);
  } while(attenteSocket == -1);
 
  printf("En attente de connexion\n");
 
  do{
    acceptation = accept(sock, (SOCKADDR*)&emetteur, &longAddr);
  } while(acceptation == -1);
 
  // Attente tant qu'on n'appuie pas sur la touche Espace
  printf("Appuyer sur espace pour lancer la consommation\n");
  do{
    scanf("%c",clavier);
  }while(!strcmp(clavier, " "));
 
  printf("Consomation lancée\n");
 
  while(1){
    lire = recv(acceptation, tampon, sizeof(tampon), 1024);
    if(lire != -1){
      printf("%s\n",i++,tampon);
    }
  }
 
}
Code 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
bool Acquisition::initConnexion(int argc , char* argv[]){
 
	bool res = true;
	WSADATA WSAData;
	WSAStartup(MAKEWORD(2,0), &WSAData);
 
	if(argc == 5){
		if(!strcmp(argv[1],"-host") && !strcmp(argv[3],"-port")){
			nomDest = argv[2];
			port = (int)argv[4];
		} else if(!strcmp(argv[3],"-host") && !strcmp(argv[1],"-port")){
			nomDest = argv[4];
			port = (int)argv[2];
		}
	} else if(argc == 3) {
		if(!strcmp(argv[1],"-host")){
			nomDest = argv[2];
			port = 9999;
		} else if(!strcmp(argv[1],"-port")){
			nomDest = "localhost";
			port = (int)argv[2];
		}
    } else if(argc == 1) {
		nomDest = "localhost";
		port = 9999;
	} else {
		usage(argv[0]);
		res = false;
	}
    int b = -10;
	if (res){
		// Résolution DNS à partir du nom de la machine
		host = gethostbyname(nomDest);
		//Initialisation de la structure sockaddr_in
		destinataire.sin_family = AF_INET;
		destinataire.sin_port = htons(port);
		memcpy(&destinataire.sin_addr, host->h_addr, host->h_length);
		for(int i=0; i<8; i++) destinataire.sin_zero[i] = 0;
 
		// Initialisation du socket
		sock = socket(AF_INET, SOCK_STREAM, 0);
		if(sock == -1){
			std::cerr << "Erreur à l'ouverture du socket\n" << std::endl;
			res = false;
		} else { 
 			//b= bind(sock, (SOCKADDR *)&destinataire, sizeof(destinataire));
		}
 
		connecte = connect(sock, (SOCKADDR*)&destinataire, sizeof(destinataire));
		if(connecte == -1){	
			std::cerr << "Echec de la connexion à " << nomDest << std::endl;
			res = false;
		} else {
			std::cout << "Connecté" << std::endl;
		}
	}
 
	return res;
}
Pour le client la connexion se fait dans une fonction d'initialisation, et l'on n'envoie ni ne reçoit rien pour le moment ...

Le serveur reste bloqué en attente de connexin alors que le client affiche connecté ...