2011-08-03 18 views
3

現在、Appleプッシュ通知付きのサーバーサイドプッシュ通知サービスで作業しています。 私はboost asioで作業しています。 は、ここに私のコードです:アップルプッシュ通知サービスC++ /ブーストが接続されていません

void IPhonePush::connection() { 
    std::cout << "Push iPhone connection" << std::endl; 
    std::cout << getCertif() << std::endl; 
    m_context.set_options(boost::asio::ssl::context::default_workarounds 
          | boost::asio::ssl::context::no_sslv2 
          | boost::asio::ssl::context::single_dh_use); 

    m_context.set_password_callback(boost::bind(&IPhonePush::get_password, this)); 
    m_context.use_certificate_chain_file(getCertif().c_str()); 
    m_context.use_private_key_file(getKey().c_str(), boost::asio::ssl::context::pem); 
    boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(tools::Ip::getServiceIp("gateway.push.apple.com")), 2195); 
    m_socket.lowest_layer().async_connect(ep, 
            boost::bind(&IPhonePush::handle_connection, 
               this, 
               boost::asio::placeholders::error)); 
    } 

    void IPhonePush::handle_connection(const boost::system::error_code& error) { 
    if (!error) { 
     std::cout << "/////////// Connected to PUSH SERVER !!!" << std::endl; 
     start_handshake(); 
    } else { 
     std::cout << "/////////// Error Connecting to push: " << error.message() << std::endl; 
    } 
    } 

    void IPhonePush::start_handshake() { 
    m_socket.async_handshake(boost::asio::ssl::stream_base::client, 
          boost::bind(&IPhonePush::handle_handshake, 
             this, 
             boost::asio::placeholders::error)); 
    } 

ツール:: Ipの:: getServiceIpは私のDNSから解決したIP得られます。その後、

namespace tools { 
    class Ip { 
    public: 
    static std::string getServiceIp(std::string url) { 
     boost::asio::io_service io; 
     tcp::resolver resolver(io); 
     tcp::resolver::query query(url, ""); 
     tcp::resolver::iterator iter = resolver.resolve(query); 

     tcp::endpoint ep; 
     while (iter != tcp::resolver::iterator()) { 
     ep = *iter++; 
     break; 
     } 
     return ep.address().to_string(); 
    } 
    }; 
} 

事がある、async_connectが呼び出され、何を... handle_connectionはエラーがなくても呼び出されません。

現在、問題がDNSをIPに解決して接続していないのではないかと疑問に思っています。 gateway.push.apple.comを直接指しているエンドポイント(IPを解決しない)との接続を求める別の方法がある場合は、

EDIT 1:

int main() { 
    boost::asio::io_service io_push; 
    push::IPhonePush ifpush(io_push); 
    ifpush.connection(); 
    io_push.run(); 
} 
+0

io_service :: run()または同等のものはどこから呼び出されますか? main.ccの –

+0

:質問の編集を参照してください。 – TheSquad

+0

IPアドレスを解決しているとは思わないが、わからない場合は、そのコードに何らかのトレースを入れて返される値を確認してください。 – iandotkelly

答えて

2

問題は、接続先のIPへ DNSを解決するから来ていない場合、私は現在、思ったんだけど。

私はこれが原因だとは思わない。ここでは、同期解決を示し、正常に動作する接続を示すサンプルプログラムを示します。私の経験で

mac:stackoverflow samm$ cat push.cc 
#include <boost/asio.hpp> 

#include <iostream> 

int 
main(unsigned argc, const char** argv) 
{ 
    using namespace boost::asio; 

    io_service io_service; 

    ip::tcp::resolver resolver(io_service); 
    ip::tcp::resolver::query query(
      "gateway.push.apple.com", 
      "2195" 
      ); 
    ip::tcp::resolver::iterator i = resolver.resolve(query); 

    ip::tcp::socket socket(io_service); 
    socket.connect(*i); 
    std::cout << "connected to: " << ip::tcp::endpoint(*i) << std::endl; 
} 
mac:stackoverflow samm$ g++ -I /opt/local/include -L/opt/local/lib -lboost_system -Wl,-rpath,/opt/local/lib push.cc 
mac:stackoverflow samm$ ./a.out 
connected to: 17.172.239.6:2195 
mac:stackoverflow samm$ 

、このような問題は、一般的にio_serviceが仕事を使い果たすか、まったく動作していない原因です。

+0

問題は実際には前にブロックしていたコード部分のために呼び出されなかったrun()ステートメントから来ていました。ありがとう – TheSquad