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)
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
@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