2012-04-15 114 views
0

我看了一下http請求的文檔,並寫了最後這頭:二進制數據

int *binary = new int[bufferLength]; // And fill it 

std::stringstream out; 
out << "POST /push1_pub?id=game HTTP/1.1\r\n"; 
out << "User-Agent: Lotosoft soccer client\r\n"; 
out << "Host: localhost\r\n"; 
out << "Accept: */*\r\n"; 
out << "Content-Type: application/octet-stream\r\n"; 
out << "Content-Length: " << bufferLength << "\r\n\r\n"; 

// Take out string from stream 
std::string headers = out.str(); 
// Length of new array of bytes (headers + binary data + \0) 
const int rawLen = headers.size() + bufferLength*sizeof(int) + 1; 

char *raw = new char[rawLen]; 
// Copy headers data into bytes array 
strcpy(raw, headers.c_str()); 
// Apply offset to bytes array and fill another part with binary array of ints 
memcpy(raw+headers.size(), binary, bufferLength*sizeof(int)); 

std::cout << raw << std::endl; 

// Send it to socket 
if (socket.send(raw, rawLen) == -1) 
{ 
    std::cout << "Failed to send headers\n"; 
} 

發佈採購信息發送全成,但我不知道一切都很好,與我的想法,以填補萬事成字節數組。這是正確的方式來傳遞二進制數據作爲後請求身體?

+1

爲什麼當您發送字節時,將length與sizeof(int)相乘?在大多數系統中,數據類型int的大小不是八位字節的大小。 – harper 2012-04-15 06:24:50

回答

1

問自己這個問題:「我發送給服務器的發佈數據的第一個字節是什麼?」。你是否看到你不知道 - 無論你的平臺恰好存儲爲數組的第一個字節,這取決於你的特定CPU如何存儲整數。

服務器不知道你的CPU如何存儲整數,所以你發送它的信息是沒有可能的,它可能是有道理的。您必須向服務器發送由服務器期望的任何格式的字節組成的查詢,而不是您的平臺喜歡的任何服務器。

此外,你告訴服務器,你要發送它bufferLength字節,但你發送它bufferLength*sizeof(int)字節。你必須保持一致。 (假設您不在使用單字節整數的平臺上。)