2013-12-11 70 views
0

我正嘗試在c中使用openssl編寫Apple Push Notification Server提供程序(APNS提供程序)。openssl ssl_read發送讀取二進制數據到char *

到目前爲止,我已經能夠通過ssl_write成功發送通知,但有時候會發生,我發送的消息被拒絕(無論出於何種原因,壞的令牌等)。當發生這種情況,我嘗試ssl_write,我得到-1字節寫入,然後APNS應該發回錯誤消息並關閉連接。

的錯誤出現在二進制和蘋果文檔在這裏描述的是由6個字節:Apple Documenatation

const int written= SSL_write(this->_ssl, buffer, bufferSize); 

int want =SSL_want(this->_ssl); 

if(want == 2){ //2 means that ssl wants to read 
char bufferRead[6];   
SSL_read(this->_ssl,bufferRead,6); 

//Some code that transfers bufferRead into a ASCII format 

} 

我要問你,我怎麼轉換這個二進制bufferRead到的東西,我可以讀取和存儲在允許說char *或std :: string。轉換後的輸出應該看起來像這樣「881234」...
我很感激任何幫助,我可以得到。由伊蘭

編輯解決方案:

unsigned char command = bufferRead[0]; 
    unsigned char status = bufferRead[1]; 
    unsigned char c2 = bufferRead[2]; 
    unsigned char c3 = bufferRead[3]; 
    unsigned char c4 = bufferRead[4]; 
    unsigned char c5 = bufferRead[5]; 

int comInt = command; 
int statusInt = status; 

int id = (c5 << 24) + 
      (c4 << 16) + 
      (c3 << 8) + 
      (c2); 

回答

0

你應該解析緩衝區中3個參數。 它已經有一段時間,因爲我用C編程,但我認爲你需要的是這樣的:

char command = bufferRead[0]; // should contain 8 
char status = bufferRead[1]; // the type of the error - the most common being 8 (InvalidToken) 
int id = (bufferRead[2] << 24) + 
     (bufferRead[3] << 16) + 
     (bufferRead[4] << 8) + 
     (bufferRead[5]); 
+0

您好,感謝快速回答。我也嘗試用各種方式解析緩衝區,但它似乎不起作用。用你的解決方案,如果我用std :: cout打印出命令,狀態,id,前兩個不打印任何東西,id是8個數字(67108864)。我也積極地認爲ssl_read返回值爲6的int。 – Malisak

+0

@Malisak你如何打印前兩個?如果你正在打印'char'變量,你不會看到任何東西,因爲ASCII值8是不可打印的字符。也許你應該把它轉換爲int。至於id,你期望的價值是什麼?該ID應該是您之前發送給Apple的消息的ID(您是創建該ID的人)。另外,你確定你正在管理讀取6個字節嗎? – Eran

+0

好的,我已經鑄造了第一個兩個變量到int,它的工作,現在都按預期打印8。至於id,我以前已經設置爲1234。構建ssl_write的消息格式的方法與前面提到的APNS文檔中的方法幾乎相同。 Ssl_read返回6,實際上是從TLS/SSL連接讀取的字節數。我試圖做strlen(bufferRead),它顯示4 ...這很奇怪。 – Malisak