SIP协议基础解析

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄yi笑奈何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值