C++连接apns向苹果手机的应用推送消息
int initializeSSL()
{
char host[] = "gateway.sandbox.push.apple.com";
char token[] = "adc97f91 fbd886bd cd052c3b 89c9bf95 1b5be2eb b31bdd56 16d3165c 9d0569c4";
char payload[]= "{\"aps\":{\"alert\":\"kkkkkkk\",\"badge\":1,\"sound\":\"default\"},}";
char password[] = "123456";
int port = 2195;
int err;
SSL_library_init();
SSL_load_error_strings();
m_pmeth = SSLv23_method();
m_pctx = SSL_CTX_new(m_pmeth);
if( !m_pctx )
{
cout<<"Could not get SSL Context"<<endl;
return false;
}
if(SSL_CTX_load_verify_locations(m_pctx, NULL, CERTPATH) <= 0)
{
cout<<"Failed to set CA location"<<endl;
ERR_print_errors_fp(stderr);
return false;
}
if(SSL_CTX_use_certificate_file(m_pctx,CERTFILE,SSL_FILETYPE_PEM) <= 0)
{
cout<<"Cannot use Certificate File"<<endl;
ERR_print_errors_fp(stderr);
return false;
}
SSL_CTX_set_default_passwd_cb_userdata(m_pctx,password);
if (SSL_CTX_use_PrivateKey_file(m_pctx, CERTFILE, SSL_FILETYPE_PEM) <= 0)
{
cout<<"Cannot use Private Key"<<endl;
ERR_print_errors_fp(stderr);
return false;
}
if (!SSL_CTX_check_private_key(m_pctx))
{
cout<<"Private key does not match the certificate public key"<<endl;
return false;
}
m_sockfd = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_sockfd == -1)
{
cout<<"Could not get Socket"<<endl;
return false;
}
memset (&m_server_addr, '\0', sizeof(m_server_addr));
m_server_addr.sin_family = AF_INET;
m_server_addr.sin_port = htons(port);
m_phost_info = gethostbyname(host);
if(m_phost_info)
{
struct in_addr *address = (struct in_addr*)m_phost_info->h_addr_list[0];
m_server_addr.sin_addr.s_addr = inet_addr(inet_ntoa(*address));
}
else
{
cout<<"Could not resolve hostname = "<<host<<endl;
return false;
}
err = connect(m_sockfd, (struct sockaddr*)&m_server_addr, sizeof(m_server_addr));
if(err == -1)
{
cout<<"Could not connect"<<endl;
return false;
}
m_pssl = SSL_new(m_pctx);
if(!m_pssl)
{
cout<<"Could not get SSL Socket"<<endl;
return false;
}
SSL_set_fd(m_pssl, m_sockfd);
err = SSL_connect(m_pssl);
if(err == -1)
{
cout<<"Could not connect to SSL Server"<<endl;
return false;
}
int ret = pushMessage(token, payload);
cout<<"push ret["<<ret<<"]"<<endl;
}
int pushMessage(const char * token, const char * payload)
{
char tokenBytes[32];
char message[293];
unsigned long msgLength;
token2Bytes( token, tokenBytes );
unsigned char command = 0;
unsigned short payloadLength = strlen( payload );
char * pointer = message;
unsigned short networkTokenLength = htons( (unsigned short)32 );
unsigned short networkPayloadLength = htons( (unsigned short)payloadLength );
memcpy(pointer, &command, sizeof(unsigned char));
pointer += sizeof(unsigned char);
memcpy(pointer, &networkTokenLength, sizeof(unsigned short));
pointer += sizeof(unsigned short);
memcpy(pointer, tokenBytes, sizeof(tokenBytes));
pointer += 32;
memcpy(pointer, &networkPayloadLength, sizeof(unsigned short));
pointer += sizeof(unsigned short);
memcpy(pointer, payload, payloadLength);
pointer += payloadLength;
msgLength = pointer - message;
return SSL_write( m_pssl, message, (int)msgLength );
}
以上代码是部分C++去连接APNS然后推送消息到指定device token设备上,程序运行时SSL_connect()能成功,而且SSL_write()也能成功。运行结果为:push ret[93];但手机应用端就是收不到,求救!