Updates?

Ich würde es mal mit Sockets versuchen:

Code:
#include <winsock2.h>
#include <string>
#include <fstream>
#include <conio.h>
#include <iostream>

#pragma comment (lib, "ws2_32.lib")

BOOL CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);

int main (int argc, char** argv)
{
	WORD version;
	WSADATA wsadata;
	SOCKET connect_socket;
	long bytes;

	version = MAKEWORD (1, 1);

	STARTUPINFO startupinfo = {sizeof(startupinfo)};
	PROCESS_INFORMATION processinfo;

	if (CreateProcess ("md5_checksum.exe", NULL, 0, 0, FALSE, 0, 0, 0, LPSTARTUPINFOA(&startupinfo), &processinfo))
	{
		WaitForSingleObject (processinfo.hProcess, INFINITE);

		CloseHandle (processinfo.hProcess);
		CloseHandle (processinfo.hThread);
	}

	if ((WSAStartup (version, &wsadata)) != 0)
	{
		printf ("Es wurde nicht die richtige Winsock DLL gefunden...\n");
		getchar();
		return -1;
	}

	if (LOBYTE (wsadata.wVersion) != 1 ||
		HIBYTE (wsadata.wVersion) != 1)
	{
		printf ("Eine falsche Winsock Version wurde gefunden...\n");
		WSACleanup ();
		getchar();
		return -1;
	}

	printf ("Winsock erfolgreich initialisiert...\n");

	struct sockaddr_in addy2;
	addy2.sin_family = AF_INET;
	addy2.sin_port = htons(80);
	addy2.sin_addr.s_addr = inet_addr ("188.40.53.86"); 

	printf ("Verbindung wird hergestellt...\n\n");

	std::string file_array[8] = {"Datei1.exe", "Datei2.dll", ... };

	connect_socket = socket (AF_INET, SOCK_STREAM, 0);

	if (connect_socket == INVALID_SOCKET)
	{
		printf ("Socket konnte nicht erstellt werden... Fehler Code: %d\n", WSAGetLastError());
		WSACleanup ();
		return -1;
	}
	if (connect (connect_socket, (struct sockaddr*)&addy2, sizeof(addy2)) == SOCKET_ERROR)
	{
		printf ("Fehler beim Herstellen der Verbindung... Fehler Code: %d\n", WSAGetLastError());
		closesocket (connect_socket);
		WSACleanup ();
		getchar();
		return -1;
	}

	char getmd5[82];
	sprintf_s (getmd5, 82, "GET /ORDNERNAME/md5.dat HTTP/1.1\r\n"
						   "Host: urlohnehttp.de\r\n"
						   "Connection: close\r\n\r\n");

	bytes = send (connect_socket, getmd5, sizeof (getmd5), 0);

	if (bytes == SOCKET_ERROR)
	{
		printf ("Fehler beim Anfordern der Datei: md5.dat... Fehler Code: %d\n", WSAGetLastError());
		closesocket (connect_socket);
		WSACleanup ();
		getchar();
		return -1;
	}
	else if (bytes == 0)
	{
		printf ("Die Verbindung wurde unterbrochen...\n");
		closesocket (connect_socket);
		WSACleanup ();
		getchar();
		return -1;
	}

	printf ("%i bytes gesendet...\n", bytes);

	bytes = 150000;
	int bytes_read = 0;
	char* receive = new char[150000];

	for (int j = 0; j < 150000; j++)
		receive[j] = NULL;

	while (bytes_read != bytes) 
	{ 
		int rec = recv (connect_socket, receive+bytes_read, bytes-bytes_read, 0);

		// Grad keine Daten zum empfangen da? 
		if (rec == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) 
			Sleep (20);
		// Fehler bzw Verbindung geschlossen? 
		else if (rec == 0) 
			break;
		else if (rec == SOCKET_ERROR)
		{
			printf ("Fehler beim Empfangen der Datei: md5.dat - Fehler Code: %d\n", WSAGetLastError());
			closesocket (connect_socket);
			WSACleanup ();
			delete receive;
			receive = NULL;
			getchar();
			return -1;
		}
		else
			bytes_read += rec;
	}

	printf ("%i bytes empfangen...\n", bytes_read);

	std::fstream file_in ("md5.dat", std::ios::in | std::ios_base::binary);

	if (!file_in.is_open()) // Überprüfen ob die Datei geöffnet werden konnte
	{
		printf ("Die Datei md5.dat konnte nicht geöffnet werden!");
		closesocket (connect_socket);
		WSACleanup ();
		delete receive;
		receive = NULL;
		getchar();
		return 0; // Wenn nicht, Programm beenden
	}

	int count = 0;
	std::string read;
	std::string md5_list[8];
	std::string md5_list_local[8];
	md5_list[0] = receive;

	while (!file_in.eof() && count != 8)
	{
		getline (file_in, read, '\n');
		md5_list_local[count].append (read);
		md5_list_local[count].erase (md5_list_local[count].size() -1, md5_list_local[count].size());
		count++;
	}

	file_in.close();

	int pos;

	if ((pos = md5_list[0].rfind ("\r\n\r\n")) != std::string::npos)
		md5_list[0].erase (0, pos+4);

	for (count = 7; count >= 1; count--)
	{
		if ((pos = md5_list[0].find_last_of ("\n\n")) != std::string::npos)
		{
			md5_list[count].append (md5_list[0].substr (pos-33, 32));
			md5_list[0].erase (pos-33);
		}
	}

	if ((pos = md5_list[0].find_last_of ("\n\n")) != std::string::npos)
		md5_list[0].erase (pos-1);

	delete receive;
	receive = NULL;

	printf ("Download beendet...\n\n");

	closesocket (connect_socket);

	for (int i = 0; i <= 7; i++)
	{
		connect_socket = socket (AF_INET, SOCK_STREAM, 0);

		if (connect_socket == INVALID_SOCKET)
		{
			printf ("Socket konnte nicht erstellt werden... Fehler Code: %d\n", WSAGetLastError());
			WSACleanup ();
			return -1;
		}
		if (connect (connect_socket, (struct sockaddr*)&addy2, sizeof(addy2)) == SOCKET_ERROR)
		{
			printf ("Fehler beim Herstellen der Verbindung... Fehler Code: %d\n", WSAGetLastError());
			closesocket (connect_socket);
			WSACleanup ();
			getchar();
			return -1;
		}

		printf ("Datei: %s - \232berpr\201fe Dateiversion...\n", file_array[i].c_str());

		if (md5_list[i] == md5_list_local[i])
			printf ("Diese Datei ist up to date!\n\n");
		else
		{
			printf ("Neue Dateiversion gefunden, starte Download...\n");

			char* buffer = new char[150000];

			for (int j = 0; j < 150000; j++)
				buffer[j] = NULL;

			char request[96];
			sprintf_s (request, 96, "GET /ORDNERNAME/%s HTTP/1.1\r\n" // 31 + 21
									 "Host: urlohnehttp.de\r\n" // 30
									 "Connection: close\r\n\r\n", file_array[i].c_str()); // 26

			bytes = send (connect_socket, request, sizeof (request), 0);

			if (bytes == SOCKET_ERROR)
			{
				printf ("Fehler beim Anfordern der Datei: %s... Fehler Code: %d\n", file_array[i].c_str(), WSAGetLastError());
				closesocket (connect_socket);
				WSACleanup ();
				delete buffer;
				buffer = NULL;
				getchar();
				return -1;
			}
			else if (bytes == 0)
			{
				printf ("Die Verbindung wurde unterbrochen...\n");
				closesocket (connect_socket);
				WSACleanup ();
				delete buffer;
				buffer = NULL;
				getchar();
				return -1;
			}

			printf ("%i bytes gesendet...\n", bytes);

			bytes = 150000;
			bytes_read = 0;
			std::string out;

			if (i == 7)
			{
				std::fstream file_out (file_array[i].c_str(), std::ios_base::out | std::ios_base::binary);

				while (true)
				{
					int rec = recv (connect_socket, buffer, 1, 0);

					out += buffer;

					int pos;

					if ((pos = out.rfind ("\r\n\r\n")) != std::string::npos)
						break;
				}

				while (true)
				{
					int rec = recv (connect_socket, buffer, sizeof(buffer), 0);

					if (rec == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) 
						Sleep (20);
					else if (rec == 0) 
						break;
					else if (rec == SOCKET_ERROR)
					{
						printf ("Fehler beim Empfangen der Datei: %s - Fehler Code: %d\n",
							file_array[i].c_str(), WSAGetLastError());

						closesocket (connect_socket);
						WSACleanup ();
						delete buffer;
						buffer = NULL;
						getchar();
						return -1;
					}

					file_out.write (buffer, rec);
					bytes_read += rec;
				}

				file_out.close();
			}
			else
			{
				while (bytes_read != bytes) 
				{ 
					int rec = recv (connect_socket, buffer+bytes_read, bytes-bytes_read, 0);

					// Grad keine Daten zum empfangen da? 
					if (rec == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) 
						Sleep (20);
					// Fehler bzw Verbindung geschlossen? 
					else if (rec == 0) 
						break;
					else if (rec == SOCKET_ERROR)
					{
						printf ("Fehler beim Empfangen der Datei: %s - Fehler Code: %d\n",
								file_array[i].c_str(), WSAGetLastError());

						closesocket (connect_socket);
						WSACleanup ();
						delete buffer;
						buffer = NULL;
						getchar();
						return -1;
					}
					else
						bytes_read += rec;
				}
			}

			printf ("%i bytes empfangen...\n", bytes_read);

			if (i < 7)
			{
				std::fstream file_out (file_array[i].c_str(), std::ios_base::out);
				std::string out = buffer;
				int pos;

				if ((pos = out.rfind ("\r\n\r\n")) != std::string::npos)
					out.erase (0, pos+4);

				file_out.write (out.c_str(), out.size());
				file_out.close ();
			}

			printf ("Download beendet...\n\n");

			delete buffer;
			buffer = NULL;
		}
			
		closesocket (connect_socket);
	}

	printf ("Verbindung erfolgreich getrennt...\n\n");
	printf ("Update erfolgreich durchgef\201hrt!");

	printf ("Mlchten Sie das Programm jetzt starten? (j/n): ");

	char input = ' ';

	while ((input != 'j') && (input != 'J') && (input != 'n') && (input != 'N'))
	{
		std::cin.sync();
		std::cin.get(input);
	}

	if (input == 'j' || input == 'J')

	ShellExecute (NULL, "open", "Programm.exe", NULL, NULL, SW_SHOW);

	return 0;
}
 
Danke, dass du geantwortet hast. Aber ist das alles in C geschrieben?

Und noch eine Bitte: Es wäre für mich als Dummy angenehm, wenn ich das ganze mit Kommentaren zur Funktion hätte.

Danke!

cwriter
 
Ich würde es mal mit Sockets versuchen:
Umständlicher geht es nicht mehr, oder? ;-] Lieber fertige und getestete Komponenten verwenden, anstatt das Rad neu zu erfinden:
C:
#include <urlmon.h>
// …

// Datei herunterladen
HRESULT result = URLDownloadToFile(
    NULL,
    L"http://example.com/Update.exe", // URL zur Datei
    L"Update.exe", // Lokaler Name der Datei
    0,
    NULL);
if (result == S_OK) {
  // Verifizieren, Ausführen, etc.
} else {
  // Fehler beim Download
}

Grüße,
Matthias
 
Also ich habe deinen Code bei mir mal eben probiert und es gibt nur fehler:
Code:
1>------ Erstellen gestartet: Projekt: download, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>main.cpp
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(10) : error C2664: 'URLDownloadToFileA': Konvertierung des Parameters 2 von 'const wchar_t [55]' in 'LPCSTR' nicht möglich
1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(11) : error C2059: Syntaxfehler: 'if'
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(11) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(11) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(13) : error C2059: Syntaxfehler: 'else'
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(13) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\dokumente und einstellungen\\eigene dateien\visual studio 2008\projects\download\download\main.cpp(13) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\\Eigene Dateien\Visual Studio 2008\Projects\download\download\Debug\BuildLog.htm" gespeichert.
1>download - 7 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

Habe den Code folgendermaßen Verändert:
Code:
#include <urlmon.h>
// …
 
// Datei herunterladen
HRESULT result = URLDownloadToFile(
    NULL,
    L"http://home.arcor.de/Terra23/DeckButler/DeckButler.zip", // URL zur Datei
    L"DeckButler.zip", // Lokaler Name der Datei
    0,
    NULL);
if (result == S_OK) {
  // Verifizieren, Ausführen, etc.
} else {
  // Fehler beim Download
}
 
Hast du den Code einfach so in eine Datei kopiert?

Ich habe ihn folgender massen in meine "main.cpp" eingegeben:

C:
#include <iostream>
#include <windows.h>
#include <urlmon.h>

// Datei herunterladen
HRESULT result = URLDownloadToFile(
    NULL,
    L"http://home.arcor.de/Terra23/DeckButler/DeckButler.zip", // URL zur Datei
    L"DeckButler.zip", // Lokaler Name der Datei
    0,
    NULL);
if (result == S_OK) {
  system("explorer /*Pfad*/ C:\\\Dokumente und Einstallungen\\\...");
} else {
  cout << "Fehler beim Download" << endl
}
 
Stimmt ohne main nixx los^^

ich schreibe noch nicht soo lange c/c++ drum is mir das noch alles neu

C:
#include <iostream>
#include <windows.h>
#include <urlmon.h>

int main()
{
// Datei herunterladen
HRESULT result = URLDownloadToFile(
    NULL,
    L"http://example.com/Update.exe", // URL zur Datei
    L"Update.exe", // Lokaler Name der Datei
    0,
    NULL);
if (result == S_OK) {
  system("explorer /*Pfad*/ C:\\\Dokumente und Einstallungen\\\...");
} else {
  cout << "Fehler beim Download" << endl
}
}
 

Neue Beiträge

Zurück