В настоящее время я работаю над сервисом push-уведомлений на стороне сервера с Apple push-уведомлением.
Я работаю с Boost Asio.
Вот мой код:
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 дает мне IP-адрес, разрешенный из DNS:
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)?
РЕДАКТИРОВАТЬ 1:
int main() {
boost::asio::io_service io_push;
push::IPhonePush ifpush(io_push);
ifpush.connection();
io_push.run();
}