[socket] Pb send() et recv()
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) :
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
| 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;
} |
Et voici le traitement du 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
| 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);
}
} |
Je pense que l'erreur provient de l'envoi. Je sais qu'en C on fait en general quelque chose comme ca :
Code:
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 ); |
Mais je voudrais quelque chose qui soit du C++.
Merci de me faire de vos remarques/conseils (ou autres).