Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Réseau
Réseau Forum d'entraide sur la programmation réseau en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/10/2012, 19h50   #1
_Fenrir_
 
Inscription : janvier 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 4
Points : -1
Points : -1
Par défaut [Socket] Réception incohérente

Bonjour,

Je viens aujourd'hui suite à un petit soucis que je rencontre dans mon application réseau et qui me parait étrange. Le problème se situe lors d'un envoi/réception précis. Donc tout d'abord voici un petit bout de code pour illustrer:

Méthode add:
Code :
1
2
3
4
5
6
7
template<typename T>
void add(const T & msg )
{
      std::ostringstream oss;
      oss << msg;
      m_Data += oss.str() + '|';
}
Méthode SendData:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
void Server::sendData(int index, NetworkMessage& msg)
{
    ostringstream oss;
    string str = "";
 
    oss << msg.getType();
    str = oss.str() + '|' + msg.getMessage();
 
    unsigned int n = send(m_Client[index]->getSocket(), str.c_str(), str.size(), 0);
    if(n < 0)
        removeClient(index);
}
Code incriminé:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NetworkMessage msg1(DATA_NEW_CARD, "blablabla");
sendData(index, msg1);// (envoi 1)
 
vector<int> infosIndex = m_Zone[num]->getInfos();
for (unsigned int i = 0; i < infosIndex.size(); i++)
{
      NetworkMessage msg(DATA_NEW_CARD);
      msg.add(m_Cards[infosIndex[i]]->getIndex());
      msg.add(m_Cards[infosIndex[i]]->getName());
      msg.add(m_Cards[infosIndex[i]]->getNum());
      msg.add(m_Cards[infosIndex[i]]->getType());
      msg.add(m_Cards[infosIndex[i]]->getSize());
      sendData(index, msg); // (envoi 2)
}
 
NetworkMessage msg2(DATA_NEW_CARD, "blablabla");
sendData(index, msg2);// (envoi 3)
Code :
Format trame attendue côté client: msg_type|index|name|num|type|size|
Lors des envois 1 et 3 la trame attendue est correcte mais le problème se pose lors de l'envoi 2.

Ma vision de l'envoi 2:

- Instanciation d'un objet msg avec en paramètre le type du message
- Ajout de divers infos au contenu de msg
- Envoi
- Puis on recommence autant de fois que nécessaire...

Il devrai donc y avoir X envois (i < infosIndex.size()) mais voici ce que j'obtiens côté client:

Code :
Trame reçue: msg_type|index|name|num|type|size|msg_type|index|name|num|type|size|msg_type|index|name|num|type|size|...
(les X envois qui devrait êtres reçues séparément sont condenser en un message)

J'espère que tout cela sera suffisant pour tenter de me répondre ^^"
En tout cas, j'arrive pas a comprendre pourquoi le code fait cela =/

Cordialement,
_Fenrir_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 08h42   #2
Pop360
Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 29
Points : 61
Points : 61
Salut, c'est sûrement parce que les données sont placées dans un tampon pour éviter de consommer trop de ressources. Du coup elle ne sont envoyées qu'au dernier moment (ou quand le tampon est plein).
Pour éviter ça il faut activer le flag PUSH dans le paquet, ça fait une émission immédiate du paquet à l'appel de send.

J'imagine que le protocole doit être TCP, donc normalement il faut s'y prendre comme ça :
(en rajoutant l'option NO_DELAY à la socket)

Code :
1
2
3
4
5
6
7
8
9
 
/* ... création de de la socket */
 
int autorisation = 1;
 
if (setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &autorisation, sizeof(int)) < 0)
   perror("erreur");
 
/* ...*/
Où socket est la socket sur laquelle tu envoies. Donc comme c'est un tableau va sûrement falloir l'appeler à la création des sockets de chaque client.

C++dialement,

Pop360
Pop360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h44.


 
 
 
 
Partenaires

Hébergement Web