我創建了我用C++編寫的第一個程序的更新機制。 理論是:C++從http下載二進制文件
- 程序發送它的版本到服務器PHP作爲一個HTTP頭,如果
- 服務器檢查更新的版本存在
- 如果是這樣,服務器會發送新的二進制到客戶端。
它的大部分工作不過收到的二進制格式不正確。當我比較不正確的exe文件和exe文件時,我在編譯好的exe文件中有\r\n
s的地方有差異。看起來像\r
增加了一倍。
我的C++下載代碼:
void checkForUpdates() {
SOCKET sock = createHttpSocket(); // creates the socket, nothing wrong here, other requests work
char* msg = (char*)"GET /u/2 HTTP/1.1\r\nHost: imgup.hu\r\nUser-Agent: imgup uploader app\r\nVersion: 1\r\n\r\n";
if (send(sock, msg, strlen(msg), 0) == SOCKET_ERROR) {
error("send failed with error\n");
}
shutdown(sock, SD_SEND);
FILE *fp = fopen("update.exe", "w");
char answ[1024] = {};
int iResult;
bool first = false;
do {
if ((iResult = recv(sock, answ, 1024, 0)) < 0) {
error("recv failed with error\n");
}
if (first) {
info (answ); // debug purposes
first = false;
} else {
fwrite(answ, 1, iResult, fp);
fflush(fp);
}
} while (iResult > 0);
shutdown(sock, SD_RECEIVE);
if (closesocket(sock) == SOCKET_ERROR) {
error("closesocket failed with error\n");
}
fclose(fp);
delete[] answ;
}
和我的PHP處理請求
<?php
if (!function_exists('getallheaders')) {
function getallheaders() {
$headers = '';
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
$version = '0';
foreach (getallheaders() as $name => $value) {
if (strtolower ($name) == 'version') {
$version = $value;
break;
}
}
if ($version == '0') {
exit('error');
}
if ($handle = opendir('.')) {
while (false !== ($entry = readdir($handle))) {
if ($entry != '.' && $entry != '..' && $entry != 'u.php') {
if (intval ($entry) > intval($version)) {
header('Content-Version: ' . $entry);
header('Content-Length: ' . filesize($entry));
header('Content-Type: application/octet-stream');
echo "\r\n";
ob_clean();
flush();
readfile($entry);
exit();
}
}
}
closedir($handle);
}
echo 'error2';
?>
通知我沖洗內容後,我送頭ob_clean(); flush();
所以我沒有的方式用C++解析它們。寫入文件的第一個字節很好,所以我懷疑這裏有什麼問題。
而且,二進制文件http://i.imgup.hu/meC16C.png
問題的例子比較:是否HTTP逃避二進制文件傳輸\r\n
?如果不是,是什麼導致了這種行爲,我該如何解決這個問題?
您應該以二進制格式打開輸出文件。 'fopen(「update.exe」,「wb」);' –
我不是一個C++大師,但似乎數據並沒有被轉義,這意味着字符串將被解釋爲元字符而不是字面意思。 – Ohgodwhy
@RetiredNinja就像一個魅力,解答問題的答案將不勝感激,投票並接受爲正確的答案。 – 19greg96