Я пытаюсь написать простой SIP-сниффер, используя libtins, который работает хорошо. Затем я пытаюсь разобрать полученный пакет на libosip. Хотя он правильно разбирает сообщение, он умирает молча.с использованием libtins и libosip
Я понятия не имею, что может быть неправильным здесь, некоторая помощь будет принята с благодарностью!
это мой источник:
#include <iostream>
#include "tins/tins.h"
#include <osip2/osip.h>
#include <osipparser2/osip_message.h>
#include <vector>
using namespace Tins;
bool invalidChar (char c);
void stripUnicode(std::string & str);
bool callback(const PDU &pdu)
{
const IP &ip = pdu.rfind_pdu<IP>(); // Find the IP layer
const UDP &udp = pdu.rfind_pdu<UDP>(); // Find the TCP layer
osip_message *sip;
osip_message_init(&sip);
// First here we print Source and Destination Information
std::cout << ip.src_addr() << ':' << udp.sport() << " -> "
<< ip.dst_addr() << ':' << udp.dport() << std::endl;
// Extract the RawPDU object.
const RawPDU& raw = udp.rfind_pdu<RawPDU>();
// Finally, take the payload (this is a vector<uint8_t>)
const RawPDU::payload_type& payload = raw.payload();
// We create a string message
std::string message(payload.begin(), payload.end());
std::string sip_message;
// Try to parse the message
std::cout << "copying message with len " << message.size() << std::endl;
const char *msg = message.c_str();
std::cout << "parsing message with size " << strlen(msg) << std::endl;
osip_message_parse(sip, msg, strlen(msg));
std::cout << "freeing message" << std::endl;
osip_message_free(sip);
return true;
}
int main(int argc, char *argv[])
{
if(argc != 2) {
std::cout << "Usage: " << *argv << " <interface>" << std::endl;
return 1;
}
// Sniff on the provided interface in promiscuos mode
Sniffer sniffer(argv[1], Sniffer::PROMISC);
// Only capture udp packets sent to port 53
sniffer.set_filter("port 5060");
// Start the capture
sniffer.sniff_loop(callback);
}
Выход заключается в следующем:
1.2.3.4:5060 -> 4.3.2.1:5060
copying message with len 333
parsing message with size 333
И он умирает молча.
Если удалить строку:
osip_message_parse(sip, msg, strlen(msg));
Он продолжает идти отлично ...
Спасибо большое за помощь!
(ОТ) (не мог устоять) «Я просто не знаю, что пошло не так!» (c) –
В серьезной заметке, возможно, запустите это в отладчике и запустите 'exit' /' _exit'? –
Я не могу, мой отладчик не работает в моей удаленной системе ... :( –