» »

Casovni problem v C/C++

Casovni problem v C/C++

nicnevem ::

Naredil sem en beden prog, ki preverja če je določen IP na netu ( in če posluša na določenem portu )...
Stvarca je narejena v grafičnem načinu, sicer bolj zanič, ampak deluje pa le :)
V primeru da je online mi nekaj izpiše in to zlo hitro....v nasprotnem primeru pa melje ful dolgo, kot da bi skeniral pol neta in šele pol napiše da je pač offline. Meni gre na živce ker tak dolg traja pa me zanima če se da to na kak način popravit?

zahvaljujem se za vsakršen hint, če pa rabite še kaj vedet (mogoče videt source, ki ga najrajš ne kažem okol :8) ) pa kar na dan z besedo ;)

SasoS ::

Zato ker...če je mašina na netu dobi takoj odgovor in ti to izpiše. V nasprotnem primeru mora čakati na timeout (ker pač odgovora ni) in odvisno na koliko je ta timeout naštiman moraš čakati toliko časa.

CCfly ::

Si naredil skripto v lupini ?

nicnevem ::

Torej moram na en način nastavit timeout, ki je v mojem primeru občutno predolg - cca. : 20 sekund 8-O , oziroma tolko časa prog melje da mi vrne offline status.... :|

CCfly ni skripta, ampak ena funkcija + še nekaj šare, ki sem jo od nekoga copy->pastal :8)

Kako se napiše koda v post da so ta pravi zamiki pa te reči?

kopernik ::

Kako se napiše koda v post da so ta pravi zamiki pa te reči?

Svojo kodo obdaj s slo-tech tagom st.koda.
Natančnejše navodilo si preberi v tem članku

nicnevem ::

thx, kopernik...

no, stvarca zgleda nekako takole (mal krame sm ven zmetal):

bool checkPort( int port, u_long IP )
{
	struct sockaddr_in client;
	bool ok = true;
	
	bool open;
	int sock;

	client.sin_family      = AF_INET;
	client.sin_port        = htons(port);
	client.sin_addr.s_addr = IP;

	sock = socket(AF_INET, SOCK_STREAM, 0);

	open = (connect(sock, (struct sockaddr *) &client,sizeof(client)) == 0);


	if(open)
	{
		return true;	//Connection accepted		
	}
	else
	{		
		return false;
        }
        
    }
}

u_long LookupAddress(const char* szHost)
{
	u_long nRemoteAddr = inet_addr(szHost);
    
	if (nRemoteAddr == INADDR_NONE) 
    {	//szHost is not dotted-quad, so resolve..
		hostent* pHE = gethostbyname(szHost);
        
		if (pHE == 0) 
		{
			return INADDR_NONE;
		}
		nRemoteAddr = *((u_long*)pHE->h_addr_list[0]);
	}

	return nRemoteAddr;
}

/* ta glavna funkcija, ki kliče prvi dve... */
bool portscan()
{	
	u_long nIP; //unsigned long integer -> (pozit. celo št.) 
	bool connect;
	
	WSADATA wsaData; //ena struktura		
	
	if(WSAStartup(0x0101, &wsaData) != 0)
	{
		//cerr << "An error occured when trying to initialize winsock" << endl;
		return false;
	}

	nIP = LookupAddress( IP ); 

	if (nIP == INADDR_NONE) 
	{
		//cerr << "Unable to resolve " << IP << endl;
		return false;
    }

	in_addr Address;
	memcpy(&Address, &nIP, sizeof(u_long));
	
	connect = checkPort( nPort, nIP );
	
	WSACleanup();

	delete[] IP;
	
	return connect; //true if accept. else false
}



Problem je ker se mi ne sanja na kak način bi zmanjšal tist timeout....ali pa na kak drug način naredil da bi stvar delala hitreje v primeru da je comp offline. Če ima kdo preveč cajta in volje naj prosim malo pogleda kodo...kak hint bi bil zlo dobrodošel :)

nicnevem ::

Zdej sem pa res že siten, heh

Kako se naredi da 2 funkciji tečeta istočasno? Večnitnost al kaj druzga? :\

kopernik ::

V osnovi je torej problem timeout. Dodatno ta problem poslabšuje dejstvo, da so tej timeouti pri network povezavah lahko različni od sistema do sistema ali pa od prog. jezika do prog. jezika (še posebej pri C-ju, kjer moraš dobro prebrati, kakšna je implementacija [cc, gcc za *nix; Microsoft, Borland za win ...]) - ti bo kak C maher kaj več povedal. Skratka, nikoli vnaprej ne veš, kolikšen bo timeout, ker ne veš, kje bo tvoj program tekel.

Ena rešitev je uporaba threadov (niti). Povezavo do nekega URL-ja vzpostaviš v svoji niti, v glavni niti pa čakaš, da se povezava v drugi niti vzpostavi. Ker lahko iz glavne niti nadzoruješ čas izvajanja ostalih niti, je potem problem rešen. Po npr. petih sekundah prekineš nit, ki skrbi za povezavo, in uporabniku vrneš odgovor.

Za C++ ti žal ne znam pomagati, ker se v tem jeziku še nikoli nisem ukvarjal z nitkami :-) Če želiš, ti lahko podam rešitev v Javi.

Zgodovina sprememb…

  • spremenil: kopernik ()

kopernik ::

Seveda je najlažje poguglati za kako knjižnico, kjer je to že narejeno ...

sid_dabster ::

Glede na to, da tocno ves, koliko threadov bos imel (2), ni nikakrsen problem spisati ustreznega programa. Le uporabi api CreateThread, kateremu med drugim podas kazalec na funkcijo, ki jo hoces laufat v locenem threadu. Pa pazi na mutexe, kar pa zaradi preprostosti programa sploh ne bo problem. Pa mislim, da jih sploh ne bos rabil.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c] ne sprejme UDP paketa

Oddelek: Programiranje
7982 (570) slovencl
»

[C++] bind

Oddelek: Programiranje
61450 (1228) fiction
»

SMTP v c -ju

Oddelek: Programiranje
282117 (1258) BigWhale
»

Delo z omrezjem v linuxu

Oddelek: Programiranje
101295 (1141) CCfly
»

C: connect() funkcija, kako nastaviti timeout

Oddelek: Programiranje
231763 (1544) fefko-the-bulldog

Več podobnih tem