Anonymní profil Ivo – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Ivo – Programujte.comAnonymní profil Ivo – Programujte.com

 

Příspěvky odeslané z IP adresy 78.45.50.–

Ivo
C / C++ › :) zase Já, gethostbyaddr
21. 4. 2013   #175315

To sice ne, ale tohle volání Isbanned probíhá v Update funkci (kvůli tomu aby proběhlo co nejdřiv po tom co se hráč připojí).. a kdyz to trva moc dlouho tak se mi pozastavi ta update funkce.

(ta funkce dělá to že updatuje fragy skore, jmeno ping.... - vytahuje to z Object.lto (to je dll knihovna serveru, která komunikuje s klientama pomocí byte zpráv)) a pak to používá při zbrazení těch informací přímo v okně toho serveru.

IP nezjišťuju z paketu. ale přímo v konzoli serveru (ve funkce která zpracovává chat konsoli na screenu.. odchytím si všechno co začíná New Client a pak z toho dostávám tu ip a tu zprávu zahazuju aby mi nedělala bordel v chatu :))  - ta hra v sobě nic takovýho originálně vůbec nemá a nebyla tam ani žádná podpora pro to.. kdyby se ta IP nevypisovala do konsole, tak ani není jinej způsob jak ji z klienta vydolovat. a i to že se vypisuje v chatu je zásluha nějakýho týpka kterej před lety upravil server.dll soubor v disasembleru aby to takhle vypisoval.

bohužel nejsem schopnej se dostat o moc hloub a netuším jak fungujou vlákna uvnitř tý aplikace.. a to ne díky tomu že bych neměl tucha.. ale 90% kódu je ve formě LIB souborů.. tak to prostě před 12 lety Sierra vydala.. obahuje to součásti engine a já se k tomu prostě nedostanu.. a i kdyby tak drtivá většina těch LIB je sdílená i s klientskou části..a do tý já hrabat nemůžu. sama o sobě třeba funkce

m_pServerMgr->BootClient(nClientId)

vůbec nemám tušení jak funguje.. protože je definovaná v lib souborech a už předkompilovaná..

v h souborech najdeš jen 

virtual LTBOOL BootClient(uint32 dwClientID)=0;

ale to tělo té funkce prostě nikde není.

není třeba možný zavolat to IsBanned ale nečekat? to asi nejde..tak nevim no :(

Ivo
C / C++ › :) zase Já, gethostbyaddr
21. 4. 2013   #175309

Hoj ahoj lidi, obracím se na lidi tady protože  mi zatím vždy někdo poradil a pomohl mi :)

můj "dotaz" má tři části,

první by byla kontrola kódu a co by jste v něm udělali jinak - lépe..

void CServerDlg::IsBanned(char a[], int nClientId, CPlayerInfo *pPlayerInfo)
{
	bool BANNED=false;

	FILE *fh = NULL;
	fh=fopen(g_LogName,"a+");
	SYSTEMTIME now;
	GetLocalTime(&now);
	fprintf(fh, "\n\n{Incoming Player - START}");
	fprintf(fh, "\n	%02d:%02d:%02d - %02d.%02d.%d : ", now.wHour, now.wMinute, now.wSecond, now.wDay, now.wMonth, now.wYear);
	fprintf(fh, "\n		Incoming Player: %s, IP: %s, ", pPlayerInfo->m_szPlayerHandle, m_JoinData[nClientId-1].m_szIP);

	FILE *HN = NULL;
	HN=fopen("Rommie_Logs/HN_DEBUG.txt","a+");

	bool damn=false;
	WORD wVersionRequested=MAKEWORD(1,1); 
	WSADATA wsaData; 
	long res=WSAStartup(wVersionRequested, &wsaData);
	unsigned long inaddr = inet_addr (m_JoinData[nClientId-1].m_szIP);

	hostent *myhostent;
	if(res!=0)
	{
		damn=true;

		fprintf(HN, "\n{HN - Debug}: WSAStartup!=0");
	}
	
	if((myhostent = gethostbyaddr((const char FAR *)&inaddr,sizeof(in_addr),AF_INET)) && damn==false)
	{
		fprintf(HN, "\n{HN}: Got HN");
		if(strlen(myhostent->h_name)>5){
			fprintf(HN, "\n{HN - Debug}: HN right - %s", myhostent->h_name);
			sprintf(m_JoinData[nClientId-1].HNAME,"%s", myhostent->h_name);
		}
		else{
			fprintf(HN, "\n{HN - Debug}: HN is shorter than 5 chars - %s - using IP - %s", myhostent->h_name, m_JoinData[nClientId-1].m_szIP);
			sprintf(m_JoinData[nClientId-1].HNAME,"%s", m_JoinData[nClientId-1].m_szIP);
		}
	}
	else
	{
		fprintf(HN, "\n{HN - Debug}: GetHostByAddr() return no value, using IP - %s", m_JoinData[nClientId-1].m_szIP);
		sprintf(m_JoinData[nClientId-1].HNAME,"%s", m_JoinData[nClientId-1].m_szIP);
	}

	WSACleanup(); 

	for(int l = 0; l < count; l++)
	{
		int iLen=0;
		iLen=strlen(HNBan[l]);

		fprintf(HN, "\n{HN - Check}: iLen %d", iLen);
		fprintf(HN, "\n{HN - Compare}: Client's HN %s, HNBan[%d]=%s", m_JoinData[nClientId-1].HNAME, l, HNBan[l]);

		if(iLen>5)
		{
			if(strstr(m_JoinData[nClientId-1].HNAME, HNBan[l]))
			{
				fprintf(HN, "\n{HN - FoundBannedHN}: Client's HN %s, HNBan[%d]=%s DING, BANNED HN!", m_JoinData[nClientId-1].HNAME, l, HNBan[l]);
	
				BANNED=true;				
			}
		}
	}

	if(BANNED==true)
	{
		fprintf(fh, "\n			HN: %s -> HN or his part is BLACKLISTED, kicking player out of game...", m_JoinData[nClientId-1].HNAME);
		fprintf(fh, "\n{Incoming Player - END}");
						
		char szMsg[512];
		sprintf(szMsg, "Player: %s - HN: %s - KICKED - (BLACKLISTED).", pPlayerInfo->m_szPlayerHandle, m_JoinData[nClientId-1].HNAME);

		m_lstShellMsgs_Shell.AddTail( szMsg );
					
		char szBuf[512];
		ostrstream memStream( szBuf, sizeof( szBuf ));
		memStream << (( BYTE )SERVERSHELL_MESSAGE ) << szMsg << ends;
		
		EnterCriticalSection( &m_CS );
			m_pServerMgr->SendToServerShell( szBuf, sizeof( szBuf ));
		LeaveCriticalSection( &m_CS );

		EnterCriticalSection( &m_CS );
			if(m_pServerMgr->BootClient(nClientId))
		LeaveCriticalSection( &m_CS );
	}
	else
	{
		fprintf(fh, "\n			HN: %s -> Allow to join, HN is not blacklisted.", m_JoinData[nClientId-1].HNAME);
		fprintf(fh, "\n{Incoming Player - END}");

		char szMsg[512];
		sprintf(szMsg, "Player: %s - HN: %s - (if you see plain IP, DNS lookup was failed.).", pPlayerInfo->m_szPlayerHandle, m_JoinData[nClientId-1].HNAME);

		m_lstShellMsgs_Shell.AddTail( szMsg );
							
		char szBuf[512];
		ostrstream memStream( szBuf, sizeof( szBuf ));
		memStream << (( BYTE )SERVERSHELL_MESSAGE ) << szMsg << ends;
		
		EnterCriticalSection( &m_CS );
			m_pServerMgr->SendToServerShell( szBuf, sizeof( szBuf ));
		LeaveCriticalSection( &m_CS );
	}
fclose(HN);
fclose(fh);
}

kód mi fuguje fajn, ALE je tu jeden problém a to:

myhostent = gethostbyaddr((const char FAR *)&inaddr,sizeof(in_addr),AF_INET)

konkrétně v "if((myhostent = gethostbyaddr((const char FAR *)&inaddr,sizeof(in_addr),AF_INET)) && damn==false)"

když se mi připojuje hráč s IP která z nějakého důvodu nejde přeložit na hostname pomocí toho gethostbyaddr tak mi celá aplikace (dedikovaný server po hru) lagne.. prostě se vlákno na 2-4 sekundy zastaví a ve hře všichni brečí že jsou lagy.. celá ta funkce kterou jsem sem pastl se volá v hlavním voidu Update()

if(m_JoinData[nClientId-1].m_bLog==true)
  {

   m_JoinData[nClientId-1].m_bLog=false;
   IsBanned(m_JoinData[nClientId-1].m_szIP, nClientId, pPlayerInfo);
  }

kde m_szIP je char ip adresa.., nClientID je vnitřní ID klienta, a pPlayerInfo je struktura ze které se tahá jméno

napadlo Mně to vyřešit "jednoduše" a to proste "IsBanned(m_JoinData[nClientId-1].m_szIP, nClientId, pPlayerInfo);" zavolat jako jiný thread pomocí "_beginthreadex( 0,0, &IsBanned, this, 0, 0 );"

ale to má dva problémy.. první je že _beginthreadex ?neumí? zavolat funkce s těma třema parametrama, nebo jsem hloupej a nepřišel jsem na to jak, a druhý problém že ta funkce by musela být unsigned int __stdcall což mi způsobí ten problém že by neměla přístup k těm datům co potřebuje..

a třetí část dotazu je zda je možné nahradit "gethostbyaddr" nějakou vyspělejší funkcí na získáni hostname z IP.. prolezl jsem pár fór někde nadávají že je ta funkce zastaralá a pomalá, ale nikde není srozumitelně napsáno jak ji nahradit jinou.

podotknu že projekt je dělaný jako MFC aplikace, Microsoft Visual C++ 6.0 (1998, hodně pravěké, ale bohužel ty originální zdrojáky té hry v jiném - novějším VS nejdou zkompilovat)

Budu velmi rád za každou pomoc, a kdyby se třeba našel někdo kdo by byl ochotný občas na Mé přiblblé dotazy odpovědět na emailu nebo ICQ, vůůůůbec bych se nezlobil :)

Ivo
C / C++ › Porovnání charů
14. 4. 2013   #174991

KIIV:

moc diky.. strstr funguje perfektne :)

nenapadlo mne to, myslel jsem ze to funguje jen kdyz porvnavam obsaz charu s plain textem, ale umi to porovnavat i dve promenne :)

dekuji :)

Jsem moc rad ze existuje neco jako pogramujte.com kde frajeri co to delaji treba prfesionalne pomahaji lamickam jako jsem ja.. nebejt tohle, tak uz jsem si davno hodil masli :) (pisu z mobilu, tak pardon ze tu nejsou hacky a carky, vim ze to tu nemate radi :)))

Ivo
C / C++ › Porovnání charů
14. 4. 2013   #174978

Ahoj, tak Mně tu máte zase :)

tentokrát je můj dotaz ještě primitivnější než minule :)

mám char m_JoinData[ClientID].HNAME ten obsahuje HOSTNAME clienta (char 256)

druhej char HNBan[99][256]

ALE:. teď je problém..

m_joindata.HNAME obsahuje KOMPLETNÍ host name.. třeba ip-1.2.3.4.net.upc.cz (příklad)

HNBAN[] obsahuje string ale ne celej.. obsahuje jen poslední část "net.upc.cz"

můj dotaz je snadnej.. jak zjistim jestli NĚKDE v m_JoinData[ClientID].HNAME je obsažené HNBAN[]?

tady je "vzorek" nefunkcniho kodu.. vim ze _stricmp bedokaze zjistit jestli je HNBan soucasti HNAME..

for(int X = 0; X < count; X++)
    {
     if(!_stricmp(m_JoinData[ClientID].HNAME, HNBan[X]))
     {
      fprintf(fh, "\HNAME %s HNBan[%d] %s\n",m_JoinData[ClientID].HNAME,X,HNBan[X]);
     }
    }

HNBan se natahuje z txt při zapnutí programu pomocí

FILE *xxx;
char Buffericek[256];
count=0;
xxx = fopen("HNBAN.txt", "rt");
if(xxx)
{
  while (fgets(Buffericek, 256, xxx) != NULL)
  {
   if(Buffericek[0]!='#')
   {
    if(strlen(Buffericek)>1)
    {
     sprintf(HNBan[count],"%s", Buffericek);
     count++;
    }
   }
  }
  fclose(xxx);
}

kdopak poradí? :)

děkujííí :)

Ivo
C / C++ › DownloadFile progress
8. 3. 2013   #172478

Dikec :) nacteno_celkem je ted DWORD64 a uz se progress bar ukazuje spravne :))

dekuju :)

Ivo
C / C++ › DownloadFile progress
8. 3. 2013   #172474

i kdyz je temp a zzz __int64 tak je to porad to same.. :( tak nevim no :/

Ivo
C / C++ › DownloadFile progress
8. 3. 2013   #172463

tak panove ani jedno nepomohlo :D :D

int64, vydeleni 1024, unsigned int.. :D porad ten progressbar ukazuje blbe :D :D

ale je zajimave ze u souboru 18MB to ukazuje spravne.. ale u 42MB ne.. je to nejaky sahly :)) nejaky dalsi napady? :)

Ivo
C / C++ › DownloadFile progress
7. 3. 2013   #172453

Zkusil jsem unsigned int a bohuzel.. porad to dela totez :/

Ivo
C / C++ › DownloadFile progress
7. 3. 2013   #172436

4G je jako co?

Ivo
C / C++ › DownloadFile progress
6. 3. 2013   #172383

to nepomohlo.. stejne to zase ten progress bar posila od nuly :/

je to divny.. zacne to stahovat a jede to 

1%

2%

3%

...

...

95%

96%

0%

1%

2%

3%

BOOL DownloadFile(LPCTSTR lpUrl, LPCTSTR lpFileName, LPCTSTR lpAppName = TEXT("Loader"))
{
	DWORD start = timeGetTime();
	sprintf(DebugMsg, "::DownloadFile()->Start()");
	RommieDebug(DebugMsg);
	HINTERNET hInet = INVALID_HANDLE_VALUE;
	HINTERNET hFile   =  INVALID_HANDLE_VALUE;
	HANDLE  hLocalFile = INVALID_HANDLE_VALUE;
	BOOL WINAPI CleanupCredentialCache(void);
	int nError = ERROR_SUCCESS;
	DWORD nacteno_celkem = 0;
	wchar_t sz_velikost[50];
	DWORD dwTOTALSize = sizeof(sz_velikost);
	char szZprava[256];
	bool msg=false;
	int zzz=0;
	int horni_mez=100;
//	CWnd *const pWndCheck = AfxGetMainWnd()->GetDlgItem(/*IDC_STATICxxx*/IDC_EDIT4);

	AfxGetMainWnd()->SendDlgItemMessage((int)AfxGetMainWnd()->GetDlgItem(IDC_PROGRESS1), PBM_SETRANGE, MAKELPARAM(0, 100));
	AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 0, 0);
	
	if( nError  == ERROR_SUCCESS )
	{
		hInet = InternetOpen(lpAppName,/*INTERNET_OPEN_TYPE_PRECONFIG*/INTERNET_OPEN_TYPE_DIRECT,0,0,0);
		if( hInet == INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		hFile = InternetOpenUrl(hInet,lpUrl,0,0,/*0*/INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD,0);
		if(hFile == INVALID_HANDLE_VALUE)
			nError = GetLastError();
   	}
	if( nError == ERROR_SUCCESS )
	{
		hLocalFile = CreateFile(lpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
		if( hLocalFile== INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}

	HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, NULL);

	int temp = atoi((LPCTSTR)sz_velikost);

	if(temp>153600)
	{
		msg=true;
	}

	if( nError == ERROR_SUCCESS )
	{
		DWORD dwBytesRead = 0;
		BYTE buffer[2048];
		
		while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
		{
			nacteno_celkem += dwBytesRead;
			if(msg)
			{
				zzz=nacteno_celkem*100/temp;
				if(timeGetTime()-start > 250)
				{
					sprintf(szZprava, "Staženo\r\n%dB z %dB\r\n%dMB z %dMB",nacteno_celkem, temp, nacteno_celkem/1024/1024, temp/1024/1024);
					AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
				
					if(zzz>horni_mez)
						zzz = horni_mez;
						
					AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, zzz, 0);
	
					sprintf(DebugMsg, "Stahovani \"%s\" -> %d%%", lpFileName, zzz);
					RommieDebug(DebugMsg);

					start = timeGetTime();
				}
			}
			WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
		}
	}
	if( hLocalFile )
		CloseHandle(hLocalFile);

	if( hFile != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hFile);

	if( hInet != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hInet);

	sprintf(DebugMsg, "::DownloadFile()->Hotovo(Status:%d - stazeno %dB)",nError, nacteno_celkem);
	RommieDebug(DebugMsg);
	
	if(temp>153600)
	{
		sprintf(szZprava, "Staženo\r\n%dB z %dB\r\n%dMB z %dMB",nacteno_celkem, temp, nacteno_celkem/1024/1024, temp/1024/1024);
		AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
		AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 100, 0);
	}
	else
	{
		sprintf(szZprava, "Staženo\r\n-B z -B\r\n-MB z -MB");
		AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
		AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 100, 0);
	}

return (BOOL) nError == ERROR_SUCCESS;
}
Ivo
C / C++ › DownloadFile progress
6. 3. 2013   #172373

akorat mam teda problem s Progress Barem..

zzz=nacteno_celkem*100/temp;

AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, zzz, 0);

sice fungje, ale treba..

stahuju 18 MB soubor a je to v pohode.. na konci stahovani je ten progressbar na konci linky..

ale kdyz stahuju druhej soubor co ma 42MB, tak to stahuje, a i v logu kdyz ho udelam vidim 1, 2, 3 jako procenta.. a na 96 to najednou zase skoci na 0 i kdyz to dal stahuje.. takze na konci stahovani mam ProgressBar na hodnote 3 nebo 4 (proste jede a tesne pred koncem skoci zase na zacatek) i kyz je soubor spravne stazenej a neposkozenej....

nechapu :/

Ivo
C / C++ › DownloadFile progress
6. 3. 2013   #172363

tak jsem to vyresil, snad dost elegantne (vytizeni procesoru pri stahovani kleslo z 18% na 3.

na zacatku DownloadFile

DWORD start = timeGetTime();

a tam kde se stahuje:

if( nError == ERROR_SUCCESS )
{
  DWORD dwBytesRead = 0;
  BYTE buffer[2048];
 
  while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
  {
   nacteno_celkem += dwBytesRead;
   if(msg)
   {
    zzz=nacteno_celkem*100/temp;
    if(timeGetTime()-start > 100)
    {
     sprintf(szZprava, "Staženo\r\n%dB z %dB\r\n%dMB z %dMB (%d%%)",nacteno_celkem, temp, nacteno_celkem/1024/1024, temp/1024/1024, zzz);
     AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
   
     if(zzz<100)
      AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, zzz, 0);

     start = timeGetTime();
    }
   }
   WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
  }
}

Ivo
C / C++ › DownloadFile progress
5. 3. 2013   #172329

tadááá

BOOL CRommiesAvP2LoaderDlg::DownloadFile(LPCTSTR lpUrl, LPCTSTR lpFileName, LPCTSTR lpAppName = TEXT("Loader"))
{  
	//FILE *fh=fopen("TESTSTAHOVANI.txt","w");

	//DWORD dwStart = GetTickCount();

	HINTERNET hInet = INVALID_HANDLE_VALUE;
	HINTERNET hFile   =  INVALID_HANDLE_VALUE;
	HANDLE  hLocalFile = INVALID_HANDLE_VALUE;
	BOOL WINAPI CleanupCredentialCache(void);
	int nError = ERROR_SUCCESS;

	DWORD nacteno_celkem = 0;
	wchar_t sz_velikost[50];
	DWORD dwTOTALSize = sizeof(sz_velikost);
	char szZprava[256];
	CWnd *const pWndCheck = AfxGetMainWnd()->GetDlgItem(IDC_STATICxxx);
	pWndCheck->EnableWindow(TRUE);

	if( nError  == ERROR_SUCCESS )
	{
		hInet = InternetOpen(lpAppName,/*INTERNET_OPEN_TYPE_PRECONFIG*/INTERNET_OPEN_TYPE_DIRECT,0,0,0);
			if( hInet == INVALID_HANDLE_VALUE )
				nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		hFile = InternetOpenUrl(hInet,lpUrl,0,0,/*0*/INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD,0);
		if(hFile == INVALID_HANDLE_VALUE)
			nError = GetLastError();
    }
	if( nError == ERROR_SUCCESS )
	{
		hLocalFile = CreateFile(lpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
		if( hLocalFile== INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}

	HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, NULL);

	int temp = atoi((LPCTSTR)sz_velikost);
	
	//fprintf(fh, "sz_velikost: %dMB\n", temp/1024/1024);

	if( nError == ERROR_SUCCESS )
	{
		DWORD dwBytesRead = 0;
		BYTE buffer[2048];
		
		while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
		{
			nacteno_celkem += dwBytesRead;
			if(nacteno_celkem>1048576)
			{
				//fprintf(fh, "Staženo  %dMB z %dMB\n",nacteno_celkem/1024/1024, temp/1024/1024);
				sprintf(szZprava, "Staženo  %dMB z %dMB\n",nacteno_celkem/1024/1024, temp/1024/1024);
			}
			else
			{
				//fprintf(fh, "Staženo %dKB z %dKB\n",nacteno_celkem/1024, temp/1024);
				sprintf(szZprava, "Staženo  %dKB z %dMB\n",nacteno_celkem/1024, temp/1024/1024);
			}

			AfxGetMainWnd()->SetDlgItemText(IDC_STATICxxx, szZprava);

			WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
		}
	}
	if( hLocalFile )
		CloseHandle(hLocalFile);

	if( hFile != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hFile);

	if( hInet != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hInet);

	DWORD dwEnd = GetTickCount();

	//DWORD time = dwEnd - dwStart;
	//fprintf(fh, "Funkce trvala : %d sekund\n",time/1000);

	sprintf(szZprava, "Status Stahování");
	AfxGetMainWnd()->SetDlgItemText(IDC_STATICxxx, szZprava);

	pWndCheck->EnableWindow(FALSE);

	//fclose(fh);

return (BOOL) nError == ERROR_SUCCESS;
}

stahuje to a v hlavním okně programu to ukazuje kolik KB/KB z kolika KB/MB je staženo :)

mám jen jednu věc.. tu zprávu sprintf(szZprava, "Staženo  %dKB z %dMB\n",nacteno_celkem/1024, temp/1024/1024); posílám do Static Textu IDC_STATICxxx a při těch aktualizacích to "problikává" jen ten static text.. nejde tomu nějak zabránit? není to nic co by mi nějak extrémně vadilo.. jen tak pro pocit :D

Ivo
C / C++ › DownloadFile progress
5. 3. 2013   #172328

finální log

sz_velikost: 42MB
Staženo 2KB z 43298KB
Staženo 4KB z 43298KB
Staženo 6KB z 43298KB
Staženo 8KB z 43298KB
Staženo 10KB z 43298KB
Staženo 12KB z 43298KB
Staženo 14KB z 43298KB
Staženo 16KB z 43298KB
Staženo 18KB z 43298KB
Staženo 20KB z 43298KB
Staženo 22KB z 43298KB
Staženo 24KB z 43298KB
Staženo 26KB z 43298KB
Staženo 28KB z 43298KB
Staženo 30KB z 43298KB
Staženo 32KB z 43298KB
Staženo 34KB z 43298KB
Staženo 36KB z 43298KB
Staženo 38KB z 43298KB
Staženo 40KB z 43298KB
Staženo 42KB z 43298KB
Staženo 44KB z 43298KB

a s tím už se dá pracovat :)

teď vymyslet jak posílat tu informaci někam dál a bude to ok :))

Ivo
C / C++ › DownloadFile progress
5. 3. 2013   #172327

sz_velikost: 42MB

nacteno_celkem/1024: 2KB

nacteno_celkem/1024: 4KB

nacteno_celkem/1024: 6KB
nacteno_celkem/1024: 8KB
nacteno_celkem/1024: 10KB
nacteno_celkem/1024: 12KB
nacteno_celkem/1024: 14KB
nacteno_celkem/1024: 16KB
nacteno_celkem/1024: 18KB
nacteno_celkem/1024: 20KB
nacteno_celkem/1024: 22KB
nacteno_celkem/1024: 24KB
nacteno_celkem/1024: 26KB
nacteno_celkem/1024: 28KB
nacteno_celkem/1024: 30KB
nacteno_celkem/1024: 32KB
nacteno_celkem/1024: 34KB
nacteno_celkem/1024: 36KB
nacteno_celkem/1024: 38KB
nacteno_celkem/1024: 40KB
nacteno_celkem/1024: 42KB
nacteno_celkem/1024: 44KB
nacteno_celkem/1024: 46KB
nacteno_celkem/1024: 48KB
nacteno_celkem/1024: 50KB

díky díky díky :)

Ivo
C / C++ › DownloadFile progress
5. 3. 2013   #172325

Ahoj


int temp = atoi((LPCTSTR)sz_velikost);

fprintf(fh, "sz_velikost: %d\n", temp);

teď už mi to vrací správnou velikost :)

děkuji :)

Ivo
C / C++ › DownloadFile progress
4. 3. 2013   #172315

tak jsem pokusem

wchar_t sz_velikost[50];

DWORD dwTOTALSize = sizeof(sz_velikost);
HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, NULL);


fprintf(fh, "%d\n",sz_velikost);

dokazal z toho vydolovat nějakou value.. ale je špatně.. soubor má velikost něco přez 44MB 

a sz_velikost mi vrací 36632248 což je blbost :/

dwTOTALsize mi vraci bud 0 nebo 16.. coz je taky nejaky nepravdepodobny :D

nehlede na to ze sz_velikost mi vraci napadne podobna cisla i kdyz chci stahnout soubor ktery ma treba jen jeden kilobajt.. tak mi vrati treba 35520056

tak nevim co je spatne :(

Ivo
C / C++ › DownloadFile progress
4. 3. 2013   #172313

děkuji za příklad, sice mi nefunguje (stahuje soubor ale neuklada ho a ani progress bar se neaktualizuje) ALE

díky struktuře Vašeho kódu jsem konečně pochopil jak to funguje, sice ne natolik abych byl schopný udělat progressbar, ale jednoduchý 

Staženo xxxKB/MB z xxxKB/MB

ano :)

ve funkci z prvního příspěvku jsem udělal úpravu:

if( nError == ERROR_SUCCESS )
{
  DWORD dwBytesRead = 0;
  DWORD dwTOTALSize = 0;
  BYTE buffer[2048];
 
  dwTOTALSize=HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, NULL, 0, 0);

  fprintf(fh, "%d\n",dwTOTALSize);
 
  while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
  {
   nacteno_celkem += dwBytesRead;
   if(nacteno_celkem>1048576)
    fprintf(fh, "%dMB\n",nacteno_celkem/1024/1024);
   else
    fprintf(fh, "%dKB\n",nacteno_celkem/1024);

   WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
  }
}

a ano, uklada mi to do txt souboru informace o to nejdriv kolik KB a potom MB bylo stazeno.. to je super.. ALE:. nejak mi porad nefunguje to zjisteni velikosti souboru na servru a nevim proc :(

dwTOTALSize=HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, NULL, 0, 0);

mi porad vraci nulu :/

hFile je

hFile = InternetOpenUrl(hInet,lpUrl,0,0,0,0);

de hlnet je hInet = InternetOpen(lpAppName,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);

a lpurl je LPCTSTR lpUrl (adresa co se pe do ty Download FIle funkce treba

DownloadFile("http://neco.neco/neco/neco.zip", "soubor.zip")

asi mam spatne tu syntaxi dwTOTALSize=HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, NULL, 0, 0);

ale nevim jak.. )

Ivo
C / C++ › DownloadFile progress
3. 3. 2013   #172276

tak nevím asi na to nemám buňky.. našel jsem o tom plno věcí ale nic jsem nepochopil :D tak holt progress stahování nebude :D veškerej výsledek byl že po mým lamským zakomponování kódu to buď nestahovalo, nebo to stahovalo ale padalo a nebo to prostě jen padalo :D nemám s mfc moc zkušeností, v C++ se nějakou dobu pohybuju ale zatím jsem dělal max tak dll (4megovou :D) ale tohle ovládání zobrazení a podobně.. to je pro Mně porod :D už jen donutit tu aplikaci sby určité věci dělala v odděleném threadu a tak se nesekala mi trvalo asi tejden :D

ale i tak děkuju za vstřícný přístup a vůbec ochotu mi na Můj dotaz odpovědět a navést Mně správným směrem.

Ivo
C / C++ › DownloadFile progress
2. 3. 2013   #172232

Děkuji za radu, veče to vyzkouším.

Ivo
C / C++ › DownloadFile progress
1. 3. 2013   #172217

Ahoj, tak Mně tu máte zase, po tom co jsem se prokousal ctenim hodnoty z IDC_EDIT, zvladl jsem MultiThreaing 

example

_beginthreadex( 0,0, &Updaterxxx, this, 0, 0 );

unsigned int __stdcall CProjectDlg::Updaterxxx( void * param )
{

}

jsem narazil na dalsi oříšek se kterým neumím hnout..

a to jak zobrazit progress stahování.. zkoušel jsem různý návody na to jak udělat progressbar ale asi jsem blbej.. úplně by mi stačilo kdyby to jako status vracelo

GetDlgItem(IDC_BUTTON4)->SetWindowTextA("Staženo xxx procent...");

nic víc nic míň.. ale prostě nejsem schopnej to zprovoznit.. pomůže mi někdo pěkně prosím?

funkce kterou používám pro stahování pochází odtud kdysi před několika lety mi tu s tím někdo pomohl:

BOOL DownloadFile(LPCTSTR lpUrl, LPCTSTR lpFileName, LPCTSTR lpAppName = TEXT("Loader"))
{  
	HINTERNET hInet = INVALID_HANDLE_VALUE;
	HINTERNET hFile   =  INVALID_HANDLE_VALUE;
	HANDLE  hLocalFile = INVALID_HANDLE_VALUE;
	BOOL WINAPI CleanupCredentialCache(void);
	int nError = ERROR_SUCCESS;
	if( nError  == ERROR_SUCCESS )
	{  
		hInet = InternetOpen(lpAppName,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);
			if( hInet == INVALID_HANDLE_VALUE )
				nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		hFile = InternetOpenUrl(hInet,lpUrl,0,0,0,0);
		if(hFile == INVALID_HANDLE_VALUE)
			nError = GetLastError();
    }
	if( nError == ERROR_SUCCESS )
	{
		hLocalFile = CreateFile(lpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
		if( hLocalFile== INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		DWORD dwBytesRead = 0;
		BYTE buffer[2048];

		while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
			WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
	}
	if( hLocalFile )
		CloseHandle(hLocalFile);

	if( hFile != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hFile);

	if( hInet != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hInet);

return (BOOL) nError == ERROR_SUCCESS;
}

volá se to :

char Adresa[]="http://www............./.../.../neco.koncovka";

DownloadFile(Adresa, "lokalni_soubor.koncovka")

nebyl by ani velký problém použít

URLDownloadToFile( NULL, string("http://www......we/neco.zip").c_str(), string("neco.zip").c_str(), 0, NULL);

Děkuji za radu nebo nějaký srozumitelný example.. 

Ivo
C / C++ › Pekne prosim o pomoc, char d…
23. 2. 2013   #171843

aha ja uz pochopil :) musim to nejak osetrit u vstupu :)

Ivo
C / C++ › Pekne prosim o pomoc, char d…
22. 2. 2013   #171807

Děkuji mnohokrát :)

CString Name(szName);
GetDlgItem(IDC_EDIT1)->SetWindowTextA((LPCTSTR)Name);

funguje, moc moc moc díky.. a jen dotaz.. proč je špatně použití sprintf(CilovaPromenna, ZdrojovaPromenna); místo sprintf(CilovaPromenna, "%s",ZdrojovaPromenna);? :)

Ivo
C / C++ › Pekne prosim o pomoc, char d…
22. 2. 2013   #171798

Hoj ahoj.. asi jsem uplne blbej a nebo jsem moc unavenej ale nemuzu prijit na to jak do IDC_EDIT1 nacist promennou z charu...

muze mi nekdo pomoct?

nacist z toho ramecku po zmacknuti tlacitko text do charu dokazu:

char buffer[128];
GetDlgItem(IDC_EDIT1)->GetWindowTextA(buffer, 128);

sprintf(szName, buffer);

ale opacnej postup (v jine casti kodu) 

zkousel jsem vsechno mozny

GetDlgItem(IDC_EDIT1)->SetWindowText(szName);

napriklad tohle se zkompiluje v pohode, ale nic se nestane.. :/

dekuji za radu.

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý