Toon posts:

[java] socket timeout?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het probleem is het volgende:

Ik heb een kleine poortscanner geprogrammeerd (opdracht voor school).
Nu kijk ik gewoon of ik kan connecten op verschillende sockets.
Indien er een exception gegooid wordt zeg ik dat de poort gesloten is.
Nu kan die wel even duren, dus dacht ik te zeggen:

code:
1
2
3
4
socket = new Socket(ipadres, port);
socket.setSoTimeout(500);
output.append("Poort: " + port " open");
socket.close()


Een timeout van 0.5 sec, maar dit haalt niks uit. Het blijft lang duren eer het programma deze sockets heeft afgelopen.
Is het mogelijk dat ik eerst de timeout moet instellen voor ik de connectie naar een socket maak?
Of doe ik hier iets anders mis?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:17

Robtimus

me Robtimus no like you

Zodra je die socket aanmaakt probeert hij al te connecten, die timeout moet je dus idd daarvoor zetten.
Uit de API:
Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite timeout.
Staat er dus vrij duidelijk: eerst timeout zetten, dan pas de blocking operation (connecten).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

en als je die time-out niet snel genoeg vindt gaan kan je ook threads gebruiken, elke thread zou dan 1 poort kunnen checken, zodat er op meerdere poorten tegelijk op een antwoord gewacht wordt.... kweet niet of dat een aantal lessen vooruit loopt ;) maar tis een optie en levert iig extra geek-points op.
let er wel op dat instance vars gedeeld worden tussen de threads.
(zie ThreadLocal om dat probleem te verhelpen...)
en nog iets, tis niet zo handig om gelijk 15.000 threads op te starten, een threadpool van 10 of 20 threads is meer dan genoeg.
/me ReSc heeft net threads uitgevonden en vindt ze _/-\o_

[ Voor 16% gewijzigd door Verwijderd op 06-10-2004 16:48 ]


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 18:50
Bekijk de api van Socket eens goed:
new Socket().connect(new InetSocketAddress(ip, port), timeout)

Die timeout geeft aan hoelang de connect mag duren. SoTimeout wordt pas gebruikt zodra er een tcp verbinding is.

[ Voor 43% gewijzigd door Jelmer op 06-10-2004 16:50 ]


Verwijderd

Topicstarter
jeps, ik moet die api nog duidelijk onder de knie krijgen.
Jullie halen daar blijkbaar makkelijker info uit dan ik.
Jelmer, moet ik die socket dan geen naam geven, om weer te sluiten?

bv
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int port = 1; port < 122 ; port++)
{

try
{
socket = new Socket().connect(new InetSocketAddress(ip, port), timeout);
print("poort open" + port);
socket.close();
}
catch(IOExecption ex)
{
print("poort gesloten" + port);
}
}


is die timeout ook in milliseconden? (int)

Dus als ik het goed begrijp is die soTimeout enkel goed indien er al een verbinding is?

Maar het duurt nog steed redelijk lang eer ik een resultaat weer krijg, dit zal misschien wel normaal zijn.

Alvast bedankt allemaal.

Ik moet wel zeggen dat jullie allemaal vrij goed overweg kunnen met de api.
Ik daarentegen zit daar in te zoeken, maar vindt die info niet zo snel en duidelijk.
Zal me nog wat moeten oefenen.

:)