#include <iostream>
#include <string>
#include <vector>
class SIPParser {
public:
SIPParser(const std::string& message) : m_message(message) {}
std::string GetMethod() const {
std::size_t start = m_message.find_first_not_of(' ');
std::size_t end = m_message.find(' ', start);
return m_message.substr(start, end - start);
}
std::string GetHeaderValue(const std::string& headerName) const {
std::size_t start = m_message.find(headerName);
if (start == std::string::npos) {
return "";
}
start = m_message.find(':', start) + 1;
std::size_t end = m_message.find("\r", start);
return m_message.substr(start, end - start);
}
std::vector<std::string> GetHeaderValues(const std::string& headerName) const {
std::vector<std::string> values;
std::size_t start = m_message.find(headerName);
if (start == std::string::npos) {
return values;
}
while (true) {
start = m_message.find(':', start) + 1;
std::size_t end = m_message.find("\r", start);
values.push_back(m_message.substr(start, end - start));
start = m_message.find(headerName, end);
if (start == std::string::npos) {
break;
}
}
return values;
}
private:
std::string m_message;
};
int main() {
std::string message = "INVITE sip:alice@example.com SIP/2.0\r\n"
"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n"
"Max-Forwards: 70\r\n"
"From: Alice <sip:alice@example.com>;tag=1928301774\r\n"
"To: Bob <sip:bob@example.com>\r\n"
"Call-ID: a84b4c76e66710\r\n"
"CSeq: 314159 INVITE\r\n"
"Contact: <sip:alice@pc33.atlanta.com>\r\n"
"\r\n"
"This is the body of the message.";
SIPParser parser(message);
std::cout << "Method: " << parser.GetMethod() << std::endl;
std::cout << "Via: " << parser.GetHeaderValue("Via") << std::endl;
std::cout << "Max-Forwards: " << parser.GetHeaderValue("Max-Forwards") << std::endl;
std::cout << "From: " << parser.GetHeaderValue("From") << std::endl;
std::cout << "To: " << parser.GetHeaderValue("To") << std::endl;
std::cout << "Call-ID: " << parser.GetHeaderValue("Call-ID") << std::endl;
std::cout << "CSeq: " << parser.GetHeaderValue("CSeq") << std::endl;
std::cout << "Contact: " << parser.GetHeaderValue("Contact") << std::endl;
std::vector<std::string> viaValues = parser.GetHeaderValues("Via");
std::cout << "Via Values: ";
for (const std::string& value : viaValues) {
std::cout << value << ", ";
}
std::cout << std::endl;
return 0;
}
SIP协议基础解析
最新推荐文章于 2024-07-26 11:22:15 发布