2017-02-06 8 views
0

나는 smppcxx 라이브러리에서 sample_app을 가져다로 설정을 변경 :왜 smppcxx sample_app가 작동하지 않고 "SMPP error : Invalid command_length"를 반환하고 충돌이 발생합니까?

const std::string ipaddr = "194.228.174.1"; 
const Smpp::Uint16 port = 9111; 
const Smpp::SystemId sysid("MaxiTipSMPP"); 
const Smpp::Password pass(<actual_password>); 
const Smpp::SystemType systype(""); 
const Smpp::Uint8 infver = 0x34; 
const Smpp::ServiceType servtype(""); 
const Smpp::Address srcaddr("234567"); 
const Smpp::Address dstaddr("420606752839"); 
const std::string msgtext = "Hello smsc"; 

라는 코드는 다음과 같습니다

Socket sd; 
    sd.connect(ipaddr.c_str(), port); 
    send_bind(sd); 
    read_bind_resp(sd); 
    //send_enquire_link(sd); 
    //read_enquire_link_resp(sd); 
    send_submit_sm(sd); 
    read_submit_sm_resp(sd); 
    Smpp::Uint32 seqnum = read_deliver_sm(sd); 
    send_deliver_sm_resp(sd, seqnum); 
    //send_data_sm(sd); 
    //read_data_sm_resp(sd); 
    //seqnum = read_deliver_sm(sd); 
    //send_deliver_sm_resp(sd, seqnum); 
    send_unbind(sd); 
    read_unbind_resp(sd); 

하고 문제 (또는 read_enquire_link_resp에서 (SD)의 경우 read_submit_sm_resp (SD)에서 발생) 주석 :

Buffer buf; 
    buf = read_smpp_pdu(sd, buf); 
    std::cout << "\nRead a submit sm resp\n"; 
    Smpp::hex_dump(&buf[0], buf.size(), std::cout); 
    Smpp::SubmitSmResp pdu; 
    std::cout << "read_submit_sm_resp buf.size() is " << buf.size() << std::endl; 
    pdu.decode(&buf[0]); 
    std::string sid = pdu.message_id(); 
    printf("response message_id: \"%s\"\n", sid.c_str()); 

라인

,545,321 0

, 이유는 무엇입니까? 응용 프로그램이 충돌합니다. 나는 코드가 그대로 작동 할 것으로 기대했지만, 그렇지는 않았다.

는 출력 :

Sending a bind transceiver 
00 00 00 2a 00 00 00 09 00 00 00 00 00 00 00 01 ...*............ 
4d 61 78 69 54 69 70 53 4d 50 50 00    MaxiTipSMPP.password 

Read a bind response 
00 00 00 15 80 00 00 09 00 00 00 00 00 00 00 01 ................ 
53 4d 53 43 00          SMSC. 
read_bind_resp buf.size() is 21 
response system_id: "SMSC" 

Sending a submit sm 
00 00 00 3d 00 00 00 04 00 00 00 00 00 00 00 01 ...=............ 
00 00 00 32 33 34 35 36 37 00 01 01 34 32 30 36 ...234567...4206 
30 36 37 35 32 38 33 39 00 00 00 00 00 00 01 00 06752839........ 
00 00 0a 48 65 6c 6c 6f 20 73 6d 73 63    ...Hello smsc 

Read a submit sm resp 
00 00 00 a4 00 00 00 05 00 00 00 00 00 00 00 01 ................ 
00 01 01 39 39 39 30 33 30 00 01 01 34 32 30 36 ...999030...4206 
30 36 37 35 32 38 33 39 00 04 00 00 00 00 00 00 06752839........ 
00 00 47 69 64 3a 66 62 32 37 37 66 62 34 33 66 ..Gid:fb277fb43f 
63 31 34 36 66 30 39 61 39 31 37 37 32 63 37 63 c146f09a91772c7c 
31 33 64 65 35 62 20 64 6f 6e 65 20 64 61 74 65 13de5b done date 
3a 31 37 30 32 30 36 30 35 30 37 30 34 20 73 74 :170206050704 st 
61 74 3a 55 4e 44 45 4c 49 56 00 1e 00 21 66 62 at:UNDELIV...!fb 
32 37 37 66 62 34 33 66 63 31 34 36 66 30 39 61 277fb43fc146f09a 
39 31 37 37 32 63 37 63 31 33 64 65 35 62 00 04 91772c7c13de5b.. 
27 00 01 05          '... 
read_submit_sm_resp buf.size() is 164 
SMPP error: Invalid command_length 

내가 출력을 추가하고 그 크기가 164이고 나는 164 바이트를 확인하고 문제없이 작동 바인드 응답에서, 크기 (21)이 내가 21 참조 알려줍니다 바이트, 어떻게 든 디코딩 기능을 수정해야합니까?

Smpp::SubmitSmResp::decode(const Smpp::Uint8* buff) 
{ 
    Response::decode(buff); 

    Smpp::Uint32 len = Response::command_length(); 
    Smpp::Uint32 offset = 16; 
    const char* err = "Bad length in submit_sm_resp"; 
    if(len < offset) 
     throw Error(err); 

    const Smpp::Char* sptr = reinterpret_cast<const Smpp::Char*>(buff); 
    message_id_ = &sptr[offset]; 
    offset += message_id_.length() + 1; 

    if(len < offset) 
     throw Error(err); 

    Header::decode_tlvs(buff + offset, len - offset); 
} 

저는 여전히 라이브러리가 그대로 작동해야한다고 생각합니다. 그래서 나는 약간의 설정이나 무언가를 바꾸어야한다고 생각합니다. 누구도 같은 문제가 있었습니까? 어떤 생각을 해야할지? 내가 원하는 유일한 것은 하루에 최대 100 개의 스팸을 보내는 것입니다 ...

답변

0

나는 그것을 고칠 수있었습니다.

1) 보내는 모든 SMS에 대해 새 연결을 여는 대신 열린 연결을 1 개만 사용하십시오. 공급자가 너무 많은 연결 통로 때문에 나를 금지했습니다.

2) 흐름은 보내기 -> 읽기 -> 보내기 -> 읽기 -> ..가 아니지만 응답 읽기는 비동기 적으로 수행되어야하며 클라이언트는 이해할 응답을 구문 분석해야하며 응답 유형 받았어요.

3) 연결은 send_enquire_link로 유지되어야합니다.

smets를 보내기 위해이 게이트웨이를 프로그래밍하는 것이 smpp에 대해 아무것도 모르는 저와 같은 사람에게는 1 manday의 범위를 훨씬 넘어 섰다고 생각합니다. 나는 일을 꽤 많이하면서 하룻밤 사이에 작업을 끝냈다. 왜 내가 그것을 추가합니까? 주된 문제는 할당 된 시간 때문에 내 접근 이었기 때문에> 나는 1 개의 만 족 작업을위한 간단한 해결책이 있어야한다고 생각했다. ...