Salut,
J'implemente une classe pour l'utilisation des sockets et mes premiers tests ne sont pas concluants. Le message que le serveur affiche est depourvu d'espaces et suivi de caracteres parasites plus ou moins bien reconnus par l'encodage. Voici le code pour l'envoi du message (c'est une classe dont le serveur et le client derive) :Et voici le traitement du 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 bool SOCKET_INIT::envoi(std::string msg) { const char *buf = msg.c_str(); int len = strlen(buf); int err = send(desc_sock, buf, len, 0); if(err == -1){ print_error("échec de l'envoi"); return false; }else if(err != len){ print_error("message partiellement envoyé"); return false; } return true; } void SOCKET_INIT::recep(string msg, string addr) { //à implémenter suivant les besoins cout << addr << " > " << msg << endl; } void SOCKET_INIT::close() { if(desc_sock != INVALID_SOCKET){ shutdown(desc_sock, 2); //ferme l'envoi et la reception } } void SOCKET_INIT::print_error(string error) { //à implementer suivant les besoins cout << "ERREUR: " << error << endl; }Je pense que l'erreur provient de l'envoi. Je sais qu'en C on fait en general quelque chose comme ca :
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 void SOCKET_SERVER::ecoute() { int error = listen(desc_sock, max_connexion); if(error == -1){ print_error("impossible d'écouter sur le port"); return; } /**** acceptation d'un client ****/ int desc_new; //descripteur de la nouvelle connexion socklen_t sin_size = sizeof(struct sockaddr_in); desc_new = accept(desc_sock, (struct sockaddr *) &their_addr, &sin_size); if(desc_new == -1){ print_error("connexion entrante refusée"); return; } while(true){ /**** réception du message ****/ char buffer[MAXDATASIZE]; int num_byte = recv(desc_new, buffer, MAXDATASIZE, 0); if(num_byte == -1){ print_error("impossible de lire le message entrant"); return; } /**** traitement du message ****/ string addr = inet_ntoa(their_addr.sin_addr); recep(buffer, addr); } }Mais je voudrais quelque chose qui soit du C++.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // créer le buffer pour copier la chaîne size_t size = message.size() + 1; char * buffer = new char[ size ]; // copier la chaîne dans le buffer strncpy( buffer, message.c_str(), size );
Merci de me faire de vos remarques/conseils (ou autres).
Partager