Socket: Comment envoyer et recevoir des octets?

Résolu
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 - 3 mars 2010 à 10:38
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 - 4 mars 2010 à 11:12
Bonjour,

Je m'appelle Amélie et je suis en apprentissage.
Je débute en C++ (j'ai suivis en partis le tutorial du site du zéros et d'autres tutoriaux) étant familière en programmation C et ayant un peu fait de java pour la programmation objet j'éssaye de me débrouiller.

Mais j'ai un problème.
J'ai réussis a faire un programme sur les Socket basé sur un client et un server s'envoyant simplement des "Hello". Mais maintenant je veu arriver a envoyer des octets et là je ne sais pas comment faire. je suis perdue.

Il faut savoir que mon programme se basait sur entre autre deux fonctions pour envoyé et recevoir une chaine de caractère: SendLine et ReceiveLine quié tait déclaré dans un header et définiot dans un source a part (c'est de toute façon comme ça que l'on fait dans les languages programmé objet a ce que j'ai compris).
J'aimerais donc tout simplement creer une fonction SendBytes et ReceiveBytes que je pourrais définir et utilisé comme bon me semble mais je n'ai aucune idée sur la gestion des octets.

Voila.

Merci a ceux qui feront attention a ce post.

Cordialement.

9 réponses

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
4 mars 2010 à 10:53
petite erreur de copier/coller : c'est ReceiveByte.

std::vector< char > buffer;
// par ex
buffer.push_back(0x45) // 1er octet
buffer.push_back(0x05) // 2e octet
....
SendBytes(buffer);
3
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 mars 2010 à 17:29
salut,

est ce que tu as accès au code sources de SendLine et ReceiveLine ?

Peux-tu nous montrer les prototypes ? Parce que je ne vois pas pourquoi tu ne pourrais pas envoyer des octets via SendLine.
0
jerem3000 Messages postés 52 Date d'inscription jeudi 23 avril 2009 Statut Membre Dernière intervention 7 décembre 2011
4 mars 2010 à 08:07
Bonsoir,

Normalement tu dois pouvoir le faire avec t'es fonction SendLine et ReceiveLine.

Je ne suis pas sur d'avoir bien comprit ton problème, en gros tu aimerais pouvoir transférer autre chose que des fichier texte ou des chaine de caractère?

Si c bien sa ton problème pour transférer des binaire il te suffit de les ouvrir en mode binaire car pour le transfert c le même principe.

jérémy
0
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 1
4 mars 2010 à 08:21
Pour mes fonctions voila leur prototypes:
//SENDLINE
void Socket::SendLine(std::string s) {
  s += '\n';
  send(s_,s.c_str(),s.length(),0);
}


//RECEIVELINE
std::string Socket::ReceiveLine() {
  std::string ret;
 //Infinite loop  
 while (1) {
    char r;

//switch(variable)
    switch(recv(s_, &r, 1, 0)) //Descriptor that identifies a connected 
//socket, a pointer to the buffer to receive incomming data (r adress), 
//length in bytes of the buffer pointed,a set of flag that influence the 
//behavior of this function. 
{   
      case 0: //If recv retiurn 0 the connection is close
  // not connected anymore;
              // ... but last line sent
              // might not end in \n,
              // so return ret anyway.
        return ret;
      case -1://Error managment
        return "";
//      if (errno == EAGAIN) {
//        return ret;
//      } else {
//      // not connected anymore
//      return "";
//      }
    }


Mon problème est que j'aimerais pouvoir transfer des octets mais je ne sais pas comment les déclarer, les utiliser.

Donc le principe c'est que je peus le faire avec ces fonctions.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
4 mars 2010 à 09:26
une idée :
Attention je n'ai pas testé (case -1 : c'est peut-etre une connerie ce que j'ai fais)et je ne suis pas super balaise en STL, mais si tu gardes les STL, je pense que ceci est possible.
//SENDBYTES
void Socket::SendBytes(std::vector< char > p) {
  send(s_,p,p.size(),0);
}


std::vector< char > Socket::ReceiveLine() {
  std::vector< char > ret;
 //Infinite loop  
 while (1) {
    char r;

//switch(variable)
    switch(recv(s_, &r, 1, 0)) //Descriptor that identifies a connected 
//socket, a pointer to the buffer to receive incomming data (r adress), 
//length in bytes of the buffer pointed,a set of flag that influence the 
//behavior of this function. 
{   
      case 0: //If recv retiurn 0 the connection is close
  // not connected anymore;
              // ... but last line sent
              // might not end in \n,
              // so return ret anyway.
        return ret;
      case -1://Error managment
        return std::vector< char >NULL;
//      if (errno == EAGAIN) {
//        return ret;
//      } else {
//      // not connected anymore
//      return "";
//      }
    }


je ne vois pas quand est affecté le char r avec les vecteurs tu feras : ret.push_back(r);
0
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 1
4 mars 2010 à 09:34
Merci beaucoup pour ton aide!


Est ce que c'est normal que dans le code il y est:
std::vector< char > Socket::ReceiveLine() {

Sinon je vais tester ce que tu m'a proposer merci beaucoup.
0
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 1
4 mars 2010 à 09:36
Toutees mes escuses je viens de comprendre le pourquoi. Je vais essayer de suite!
0
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 1
4 mars 2010 à 09:51
J'ai juste une question: quelle est la syntaxe pour envoyé des octets quand j'apelle la fonction Sendline, je dois mettre:
Sendline (0x02) ?
0
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 1
4 mars 2010 à 11:12
Très bien! Merci beaucoup!

J'ai pas mal d'erreurs je vais regarder tout ça.
En tout cas je te remerci beaucoup pour m'avoir répondus et aussi rapidement en plus.
0
Rejoignez-nous