2010-08-28 9 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 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) 
+4

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

+1

@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

Respuesta

19

Debe reemplazar

appProtocol == APP_PROTO_RTP; 

por

appProtocol = APP_PROTO_RTP; 

(sin doble signo igual)

La sentencia else se ejecuta. Pero no está asignando el valor a appProtocol en él.

+1

+1 Esta afirmación seguramente se optimizará fuera del código, junto con la rama abarcadora por completo. –

+0

Derecha. Y uno debería usar impresiones en lugar de un depurador para tales problemas. Un simple 'cout << appProtocol << endl;' hubiera mostrado el problema. – AndiDog

+8

Un buen compilador también puede advertir sobre errores como ese ("instrucción no tiene efecto"). Ayuda a activar las advertencias (y alta). – UncleBens

5

No estás asignando, estás comparando. Utilice =, no ==

3

Estás usando una declaración igualdad aquí:

appProtocol == APP_PROTO_RTP; 

en lugar de una cita.

El código correcto es:

appProtocol = APP_PROTO_RTP; 
Cuestiones relacionadas