#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;
}