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 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
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); } } }
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 ...
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; }
Le serveur reste bloqué en attente de connexin alors que le client affiche connecté ...
Partager