2010-08-28 7 views
9
void PacketRecord::determineAppProtocol() 
{ 
    if (ipProtocol == IP_PROTO_UDP) 
    { 
     std::istringstream ss(udpData); 

     std::string line; 
     if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos)) 
     { 
      appProtocol = APP_PROTO_SIP; 
     } 
     else 
     { 
      appProtocol == APP_PROTO_RTP; 
     } 
    } 
    else 
    { 
     appProtocol = APP_PROTO_UNKNOWN; 
    } 
} 

Si l'instruction interne if échoue à évaluer à vrai, je m'attendrais à ce que le bloc else soit exécuté (appProtocol défini sur APP_PROTO_RTP). Cependant, cela n'arrive pas. Au lieu de cela, il semble que l'instruction else soit complètement ignorée. Je ne peux pas comprendre pourquoi c'est le cas.else instruction est apparemment ignorée

Comme vous pouvez le voir dans ma session gdb, la première fois que l'instruction if fonctionne et appProtocol est définie sur APP_PROTO_SIP (comme prévu). la seconde fois, le casse échoue, mais au lieu d'aller dans l'autre et de définir appProtocol sur APP_PROTO_RTP, il renvoie complètement la fonction sans définir de paramètre appProtocol. appProtocol reste défini sur APP_PROTO_INVALID (la valeur avec laquelle il est initialisé dans le ctor PacketRecord).

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x805c6c8) at PacketRecord.cpp:156 
156  if (ipProtocol == IP_PROTO_UDP) 
(gdb) step 
158   std::istringstream ss(udpData); 
(gdb) 
159   std::string line; 
(gdb) 
160   if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos)) 
(gdb) 
162    appProtocol = APP_PROTO_SIP; 
(gdb) 
167   } 
(gdb) 
173 } 
(gdb) continue 
Continuing. 

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x8065388) at PacketRecord.cpp:156 
156  if (ipProtocol == IP_PROTO_UDP) 
(gdb) step 
158   std::istringstream ss(udpData); 
(gdb) 
159   std::string line; 
(gdb) 
160   if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos)) 
(gdb) 
167   } 
(gdb) 
173 } 
(gdb) 
+4

Activation des avertissements du compilateur devrait publier une « déclaration n'a pas d'effet » d'avertissement pour votre erreur de syntaxe. Sinon, obtenez un meilleur compilateur. A en juger par votre avatar ubuntu, 'g ++ -Wall' est ce que vous devriez ** toujours ** utiliser. – msw

+1

@msw: En effet. Évidemment, le code original a été _pasted_ dans la question (comme il se doit), puisque la copie manuelle aurait caché cette erreur (parce que zobdos aurait inconsciemment tapé '=', pas '=='). Un exemple (positif) de manuel expliquant pourquoi vous devriez toujours coller le code. – sbi

Répondre

19

Vous devez remplacer

appProtocol == APP_PROTO_RTP; 

par

appProtocol = APP_PROTO_RTP; 

(pas de double signe égal)

L'instruction else est exécutée. Mais vous n'attribuez pas la valeur à appProtocol dans celui-ci.

+1

+1 Cette déclaration sera sûrement optimisée à partir du code, tout comme la branche englobante. –

+0

Droite. Et on devrait utiliser des impressions au lieu d'un débogueur pour de tels problèmes. Un simple 'cout << appProtocol << endl;' aurait montré le problème. – AndiDog

+8

Un bon compilateur peut également avertir d'erreurs telles que celle-ci ("instruction n'a aucun effet"). Cela aide à activer les avertissements (et haut). – UncleBens

5

Vous n'assignez pas, vous comparez. Utilisez =, pas ==

3

Vous utilisez ici une déclaration d'égalité:

appProtocol == APP_PROTO_RTP; 

plutôt que d'un rendez-vous.

Le code est correct:

appProtocol = APP_PROTO_RTP;