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;
}
}
Если внутренний оператор if не может быть оценен как true, я ожидаю, что будет выполнен блок else (appProtocol установлен в APP_PROTO_RTP). Однако этого не происходит. Вместо этого, кажется, оператор else полностью игнорируется. Я не могу понять, почему это так.
Как вы можете видеть из моего сеанса GDB, в первый раз оператор if работает и appProtocol устанавливается в APP_PROTO_SIP (как и ожидалось). во второй раз происходит сбой if, но вместо перехода в else и установки appProtocol равным APP_PROTO_RTP он полностью выходит из функции без установки appProtocol. appProtocol остается установленным в APP_PROTO_INVALID (значение, с которым он инициализируется в 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)