IIS Webサーバーに簡単なPHPサービスが設定されています。クライアントからサーバーにファイルを取得するために使用されます。WinHttpReadDataを使用して単純なPHPサービスからファイルを取得する際に文字がドロップされる
<?php
if (isset($_GET['file']))
{
$filepath = "C:\\files\\" . $_GET['file'];
if (!strpos(pathinfo($filepath, PATHINFO_DIRNAME), "..") && file_exists($filepath) && !is_dir($filepath))
{
set_time_limit(0);
$fp = @fopen($filepath, "rb");
while(!feof($fp))
{
print(@fread($fp, 1024*8));
ob_flush();
flush();
}
}
else
{
echo "ERROR at www.testserver.com\r\n";
}
exit;
}
?>
私はWinHttpのWinHttpReadDataをC++で取得しています。
EDIT#2:ここはC++コードです。これは私のプログラムにどうやって登場するか正確には分かりません。私は複数のクラスから作品を取り上げなければなりませんでしたが、要点は明らかです。
session = WinHttpOpen(appName.c_str(), WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
if (session) connection = WinHttpConnect(session, hostName.c_str(), INTERNET_DEFAULT_HTTP_PORT, 0);
if (connection) request = WinHttpOpenRequest(connection, NULL, requestString.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
bool results = false;
if (request)
{
results = (WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0) != FALSE);
}
if (results)
{
results = (WinHttpReceiveResponse(request, NULL) != FALSE);
}
DWORD bytesCopied = 0;
DWORD size = 0;
if (results)
{
do {
results = (WinHttpQueryDataAvailable(request, &size) != FALSE);
if (results)
{
// More available data?
if (size > 0)
{
// Read the Data.
size = min(bufferSize, size);
ZeroMemory(buffer, size);
results = (WinHttpReadData(request, (LPVOID)buffer, size, &bytesCopied) != FALSE);
}
}
if (bytesCopied > 0 && !SharedShutDown.GetValue())
{
tempFile.write((PCHAR)RequestBuffer, bytesCopied);
if (tempFile.fail())
{
tempFile.close();
return false;
}
fileBytes += bytesCopied;
}
} while (bytesCopied > 0 && !SharedShutDown.GetValue());
}
Windows 7またはWindows 10マシンのいずれかのサーバーコンピュータ名を使用してローカルネットワーク経由で何千ものファイルをテストすると、すべて正常に動作します。また、Windows 7マシンからインターネット経由でサービスにアクセスするとうまく動作します。しかし、インターネットを介してアクセスするWindows 10マシンでクライアントを実行すると、文字がドロップされます。興味深いのは、それがXMLファイルから毎回削除される特定の文字セットであるということです。 (他のバイナリファイルも同様に影響を受けますが、まだ変更内容を確認していません)
XMLファイルに "<Style
"で始まる要素が含まれていると、そのテキストは消えます。だから、この:
<Element1>blah blah</Element1>
<Style_Element>hoopa hoopa</Style_Element>
<Element2>bip bop bam</Element2>
はこれを次のようになります。style要素の始まりは切り落とされ
<Element1>blah blah</Element1>
_Element>hoopa hoopa</Style_Element>
<Element2>bip bop bam</Element2>
ていることに注意してください。これは影響を受ける唯一の要素であり、ファイルに複数の要素がある場合、最初の要素にのみ影響するようです。 、他のバイナリファイル、およびテキストのいくつかの1〜3文字のそれぞれから欠落している:私をperplexes何
が、これはWindows 7の
EDITからクライアントを実行している起こらない理由です。ドロップはファイル内で一度しか起こらないようです。ファイルの残りの内容は、ソースと同じです。
C++側のコードも表示します。 –