void Servidor::ejecutar(unsigned int repeticiones) { char filename[42], palabra[42], buffer[TAM_DGRAMA+1]; for (int i = 0; i < repeticiones; ++i) { otro_descriptor = aceptar(); recibir_n(); for(int i = 0; i < n; ++i) { sprintf(filename, "%d.txt", i); archivos.push_back(Archivo(filename, O_RDONLY)); recibir(TAM_DGRAMA, buffer); palabra_aleatoria(buffer, palabra); archivos.back().escribe(palabra, strlen(palabra)); archivos.back().cerrar(); close(otro_descriptor); } } }
unsigned long BuscarActualizaciones::ThreadDescargarActualizacion(void *phWnd) { TCHAR szHead[] = TEXT("Accept: */*\r\n\r\n"); HINTERNET Sesion = InternetOpen(TEXT("BubaTronik"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, INTERNET_INVALID_PORT_NUMBER, 0); HINTERNET Peticion = InternetOpenUrl(Sesion, TEXT("http://www.devildrey33.es/BubaTronik/Instalar.exe"), szHead, 0, INTERNET_FLAG_RELOAD, 0); // DWORD Longitud = 0; DWORD Descargado = 64; DWORD TotalDescargado = 0; char Datos[4097]; DWORD TotalDatos = 0; TCHAR TotalDatosStr[64]; BOOL Ret = HttpQueryInfo(Peticion, HTTP_QUERY_CONTENT_LENGTH, (LPVOID)TotalDatosStr, &Descargado, (LPDWORD)0); if (Ret == TRUE) TotalDatos = _wtol(TotalDatosStr); HWND hWndPlayer = reinterpret_cast<HWND>(phWnd); PostMessage(hWndPlayer, MENSAJE_ACTUALIZACION_MAXIMOBARRA, NULL, static_cast<LPARAM>(TotalDatos)); Descargado = 0; DWL::DWLString PathFinal; // = Sistema.App.AppPath(); Sistema.Directorio.AppData(PathFinal); PathFinal += TEXT("\\BubaTronik\\Instalar.exe"); DWL::Archivos::DWLArchivoBinario Archivo(PathFinal(), true); while (TRUE) { PostMessage(hWndPlayer, MENSAJE_ACTUALIZACION_POSICIONBARRA, NULL, static_cast<LPARAM>(TotalDescargado)); WaitForSingleObject(Mutex, INFINITE); if (!InternetReadFile(Peticion, (LPVOID)Datos, 4096, &Descargado) || _CancelarDescarga == true) { ReleaseMutex(Mutex); break; } ReleaseMutex(Mutex); Datos[Descargado] = '\0'; TotalDescargado += Descargado; if (Descargado == 0) break; else Archivo.Guardar(Datos, Descargado); } InternetCloseHandle(Peticion); // Leemos el hash que tiene la web Peticion = InternetOpenUrl(Sesion, TEXT("http://www.devildrey33.es/BubaTronik/Instalar.exe.hash"), szHead, 0, INTERNET_FLAG_RELOAD, 0); char TxtHash[33] = ""; DWORD BytesLeidos = 0; BOOL Leido = InternetReadFile(Peticion, TxtHash, 32, &BytesLeidos); // Calculo el hash del archivo descargado #define MD5LEN 16 DWORD sz = Archivo.Posicion(0, true); HCRYPTPROV hProv = 0,hHash = 0; BYTE rgbHash[MD5LEN + 1] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; DWORD cbHash = 0; char finalhash[33] = "", dig[] = "0123456789abcdef"; BYTE *hash = new BYTE[sz]; size_t l = 0; Archivo.Posicion(0, false); Archivo.Leer(hash, sz); CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash); CryptHashData(hHash, hash, sz, 0); cbHash = MD5LEN; BOOL RET = CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0); for(DWORD i = 0; i < cbHash; i ++){ finalhash[l] = dig[rgbHash[i] >> 4]; l ++; finalhash[l] = dig[rgbHash[i] & 0xf]; l ++; } for(l = 32; l < strlen(finalhash); l++) finalhash[l] = 0; CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); delete [] hash; if (_strcmpi(finalhash, TxtHash) != 0) TotalDescargado ++; // Si no son iguales sumo 1 a los bytes descargados para retornar false InternetCloseHandle(Peticion); InternetCloseHandle(Sesion); // ReleaseMutex(Mutex); CloseHandle(Mutex); if (_CancelarDescarga == false) PostMessage(hWndPlayer, MENSAJE_ACTUALIZACION_FINDESCARGA, NULL, static_cast<LPARAM>(TotalDescargado == TotalDatos)); return TRUE; }