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 la instrucción if interna no se puede evaluar como verdadera, esperaría que se ejecutara el bloque else (appProtocol configurado como APP_PROTO_RTP). Sin embargo, esto no sucede. En cambio, parece que la declaración else se ignora por completo. No puedo entender por qué este es el caso.afirmación else aparentemente se ignora
Como puede ver en mi sesión de gdb, la primera vez que funciona la sentencia if y appProtocol se establece en APP_PROTO_SIP (como se esperaba). la segunda vez, si falla, pero en lugar de ir a lo demás y configurar el appProtocol en APP_PROTO_RTP, vuelve a salir completamente de la función sin configurar appProtocol. appProtocol permanece configurado en APP_PROTO_INVALID (el valor con el que se inicializa en el 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)
Encendido de las advertencias del compilador debe emitir una "declaración no tiene ningún efecto", advirtiendo de su error de sintaxis. Si no, obtenga un mejor compilador. A juzgar por tu avatar ubuntu, 'g ++ -Wall' es lo que ** debes ** usar **. – msw
@msw: De hecho. Obviamente, el código original fue _pasado_ en la pregunta (como debería), ya que la copia manual habría ocultado este error (porque zobdos inconscientemente habría tipeado '=', not '=='). Un ejemplo de libro de texto (positivo) de por qué siempre debes _pastar_ el código. – sbi