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 (значение, которое инициализируется в PacketRecord ctor).
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)
Вы должны заменить
appProtocol == APP_PROTO_RTP;
на
appProtocol = APP_PROTO_RTP;
(без двойного знака равенства)
Выполняется оператор else. Но вы не присваиваете в нем значение appProtocol.
Вы не присваиваете, вы сравниваете. Используйте =
, а не ==
Здесь вы используете оператор равенства:
appProtocol == APP_PROTO_RTP;
а не присваивание.
Правильный код:
appProtocol = APP_PROTO_RTP;