2012-10-02 2 views
1

Resiprocate SIP 스택을 사용하여 C++에서 SIP 프록시 구현을해야합니다. 프록시는 항상 UAC와 UAS 사이에 있어야하며 들어오는 SIP 요청과 응답을 양방향으로 전달하기 만하면됩니다.Resiprocate SIP 스택을 사용하여 SIP 요청/응답 전달

SIP 프로토콜에 대한 나의 읽기/이해에 따르면, SIP 프록시가 UAC와 UAS 사이에 앉기를 원하면 수신중인 SIP 메시지의 경로 필드에 SIP 주소를 주입해야합니다. 아무도 내 프록시 구현에 들어오는 SIP 메시지의 경로 필드를 추가/manupulate 수있는 방법을 말해 줄래? 더 정확하게 내가 알아야 할 헤더 파일/클래스/핸들 함수를 참조해야합니다 무엇입니까? 나는 SIP에 약간 익숙하고 재발행하며 소스 코드에서 길을 잃었습니다. 미리 감사드립니다.

P.S : 내가 왜 resiprocate 자신의 프록시 구현을 사용하지 않는지 궁금해 할 수 있습니다. 이는 SIP 스택 API 자체를 사용하여 특별한 필요성을 충족시키기위한 간단한 프로토 타입을 개발해야하기 때문입니다. 이 프로토 타입은 단순히 SIP 트래픽의 전달자 역할을 수행해야하며, 그 이상은 아닙니다.

답변

1

다음은 else 블록의 작업입니다. 당신이에서보고 싶어 할 수

void insertRouteField(SipMessage * received) 
     { 
      ErrLog (<< "***********************************\n"); 
      NameAddr& to = received->header(h_To); 
      ErrLog (<< "To Field: " << to.uri().toString()); 

      NameAddr& from = received->header(h_From); 
      ErrLog (<< "From Field: " << from.uri().toString()); 

      ParserContainer<NameAddr>& rRoutes = received->header(h_RecordRoutes); 
      if(!rRoutes.empty()) 
      { 
       NameAddr& frontRRoute = rRoutes.front(); 
       ErrLog (<< "rRoutes: " << frontRRoute.uri().toString()); 

       ErrLog (<< "***********************************\n"); 
      } 
      else 
      { 
       NameAddr route; 
       route.uri().scheme() = "sip"; 
       route.uri().user() = "proxy"; 
       route.uri().host() = SipStack::getHostname(); 
       route.uri().port() = 5070; 
       route.uri().param(p_transport) = Tuple::toData(mTransport); 
       rRoutes.push_front(route); 

       NameAddr& frontRRoute = rRoutes.front(); 
       ErrLog (<< "rRoute: " << frontRRoute.uri().toString()); 
       ErrLog (<< "***********************************"); 
      } 

     } 

헤더 파일러 : "resip/스택/Helper.hxx" "resip/스택/SipMessage.hxx" "resip/스택/Uri.hxx" "resip/스택 /SipStack.hxx " "rutil/Logger.hxx " "rutil/ThreadIf.hxx " "resip/stack/ParserContainer.hxx "