Ich habe einen einfachen php Service, der auf einem IIS Web-Server eingerichtet wird. Es wird von meinem Client verwendet, um Dateien vom Server abzurufen. Es sieht wie folgt aus:Zeichen, die fallen gelassen werden, die Dateien vom einfachen php Service mit WinHttpReadData zurückholen
<?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;
}
?>
ich die Dateien mit WinHttp des WinHttpReadData in C++ abrufen.
EDIT # 2: Hier ist der C++ - Code. Dies ist nicht genau so, wie es in meinem Programm erscheint. Ich musste Stücke aus mehreren Klassen ziehen, aber der Kern sollte offensichtlich sein.
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());
}
Alles funktioniert gut, wenn ich (Tausende von Dateien) testen über das lokale Netzwerk auf den Server-Computername entweder von einem Windows 7 oder Windows 10-Maschine. Es funktioniert auch gut, wenn ich über ein Windows 7-Gerät auf den Dienst über das Internet zugreife. Wenn ich den Client jedoch auf einem Windows 10-Computer ausführen lasse, der über das Internet zugreift, werden die Zeichen gelöscht. Das Interessante daran ist, dass es sich um eine bestimmte Menge von Zeichen handelt, die jedes Mal aus XML-Dateien gelöscht werden. (Andere binäre Dateien sind ebenfalls betroffen, aber ich habe noch nicht bestimmt, welche Änderungen an ihnen vorgenommen wurden.)
Wenn die XML-Datei ein Element enthält, das mit "<Style
" beginnt, verschwindet dieser Text. Also, das:
<Element1>blah blah</Element1>
<Style_Element>hoopa hoopa</Style_Element>
<Element2>bip bop bam</Element2>
wird dies:
<Element1>blah blah</Element1>
_Element>hoopa hoopa</Style_Element>
<Element2>bip bop bam</Element2>
Beachten Sie, dass der Anfang des Stilelements abgehackt wird. Dies ist das einzige betroffene Element, und es scheint nur das erste Element zu betreffen, wenn mehr als eins in der Datei vorhanden ist.
Was mich verwirrt ist, warum dies nicht der Fall den Client von Windows ausgeführt 7.
EDIT: einige der anderen Dateien, Binär-und Text, sind von 1 bis 3 Zeichen je fehlt. Es scheint, dass ein Drop nur einmal in einer Datei passiert. Der Rest des Inhalts der Datei ist identisch mit der Quelle.
Zeigen Sie den Code für C++ Seite auch. –