:) zase Já, gethostbyaddr – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

:) zase Já, gethostbyaddr – C / C++ – Fórum – Programujte.com:) zase Já, gethostbyaddr – C / C++ – Fórum – Programujte.com

 

Ivo
~ Anonymní uživatel
93 příspěvků
21. 4. 2013   #1
-
0
-

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 :)

Nahlásit jako SPAM
IP: 78.45.50.–
KIIV
~ Moderátor
+43
God of flame
21. 4. 2013   #2
-
0
-

A to mas vsechno v jednom vlaknu? I to zjisteni jestli je banovanej? + zpracovavani ostatniho jako preposilani packetu a tak?

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ivo
~ Anonymní uživatel
93 příspěvků
21. 4. 2013   #3
-
0
-

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 :(

Nahlásit jako SPAM
IP: 78.45.50.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 144 hostů

Podobná vlákna

Zase já-need second help — založil Dan Stahar

Zase knizka — založil Datlik

Zase spamování — založil hlucheucho

Zase jsem se zasek :( — založil hmm

Problémy s češtinou. Zase. — založil Párek

Moderátoři diskuze

 

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