Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Besoin d'aide!! Threads et Socket (IP Scanning) problème de timeout de connection...

1 réponse
Avatar
jgbid
J=E2=80=99ai vraiment besoin d=E2=80=99aide, je vais virer fou si je travai=
lle sur
ce probl=C3=A8me encore plus d=E2=80=99une journ=C3=A9e=E2=80=A6.

Je crois que mon probl=C3=A8me vient du faite que j=E2=80=99utilise plus d=
=E2=80=99un
socket =C3=A0 la fois. Comme si lorsqu=E2=80=99il y a trop de threads ex=C3=
=A9cutant
des sockets, ils ne fonctionnerait plus.
Mon code utilise la fonction BeginConnect avec un AutoResetEvent afin
de controler le timeout de connection et d=E2=80=99en fixer une limite
(exemple 5 sec)
Si j=E2=80=99utilise 1 seul Thread ex=C3=A9cutant un Socket tout fonctionne
bien=E2=80=A6 (=C3=A9tant beaucoup trop long pour traiter des centaines de
milliers d=E2=80=99adresse IP).

Lorsque je met un chiffre plus grand que 1 (15, 25, 50, 100, etc..)
J=E2=80=99obtiens de faux r=C3=A9sultats.

Tout fonctionne =C3=A9galement bien si je met plusieurs Thread utilisant un
Connect plut=C3=B4t qu=E2=80=99un BeginConnect, ou lorsque mon compteur att=
end la
fin de la connection avant de traiter autre chose
(AutoResetEventObj.WaitOne() au lieu de WaitOne(5000, true) pour 5 sec)


Par contre=E2=80=A6 c=E2=80=99est beaucoup trop long, si on prend l=E2=80=
=99exemple
d=E2=80=99un range de ip de 24.36.148.1 =C3=A0 24.36.148.255, alors les
derni=C3=A8res connections dans ce cas-ci 250 =C3=A0 255 prennent plus de 6
minutes =C3=A0 =C3=AAtre ex=C3=A9cut=C3=A9.

Si on retourne =C3=A0 la premi=C3=A8re id=C3=A9e (la seule pouvant fonction=
ner
correctement) le r=C3=A9sultat attendu serait
24.36.148.10=3DClose --> Time : 00:00:01.0781250
24.36.148.23=3DClose --> Time : 00:00:01.1406250
=E2=80=A6
24.36.148.164=3DClose --> Time : 00:00:01.0781250
Ceci =C3=A9tant tout les ports ayant moins de 6 secondes (donc atteignable
mais ayant le port 80 ferm=C3=A9)

Les IP non atteignable devrait avoir comme r=C3=A9sultat ceci :
24.36.148.82=3DClose --> Time : 00:00:06
24.36.148.83=3DClose --> Time : 00:00:06
=E2=80=A6
=E2=80=A6
Et finalement, la seule adresse IP entre 24.36.148.1 to 24.36.148.255
24.36.148.180=3DOpen --> Time : 00:00:00.1093750

Voici ce que j=E2=80=99obtient avec plusieurs threads (donc plusieurs
sockets)
24.36.148.10=3DClose --> Time : 00:00:01.0781250 =EF=83=9F =C3=A9tant le =
seul
r=C3=A9sultat obtenu..
les autres =C3=A9tant tous comme celui-ci
24.36.148.83=3DClose --> Time : 00:00:06
m=C3=AAme l=E2=80=99adresse IP ayant le port 80 ouvert.
24.36.148.180=3DClose --> Time : 00:00:06


Je ne comprends vraiment pas pourquoi les autres sont tous =C3=A0 6sec et
plus=E2=80=A6
Comme si apr=C3=A8s 6 sec, lorsque je Close le socket, il ne serait pas
vraiment ferm=C3=A9. Alors, la connection en dedans de 6 secondes devient
alors impossible puisqu=E2=80=99il y a trop de socket ouvert. Mais comment
faire pour r=C3=A9gler ce probl=C3=A8me ???
J=E2=80=99ai essayer avec l=E2=80=99option ReuseAddress mais sans succ=C3=
=A8s, j=E2=80=99ai
le m=C3=AAme probl=C3=A8me=E2=80=A6
Je suis d=C3=A9sesp=C3=A9r=C3=A9 svp aidez moi !!!!!!

Voici mon code :
Je construit une Queue d=E2=80=99addresse IP (des milliers de ips)
Je cr=C3=A9e un Array de Threads
Thread[] threadsRun =3D new Thread[ m_iMaxRunning ];
O=C3=B9 m_iMaxRunning doit =C3=AAtre une valeur entre 1 et 250;
for(int nIndex =3D 0; nIndex < m_iMaxRunning; nIndex ++)
{
threadsRun[nIndex] =3D new Thread( new ThreadStart( HTTPScanRunFunction
) );
threadsRun[nIndex].Start();
}

Dans la fonction du Treahd HTTPScanRunFunction
Je boucle tant qu=E2=80=99il y a des ip =C3=A0 Dequeue
while(m_queueIP.Count > 0)
{
long iIP =3D 0;
lock(m_queueIP)
{
iIP =3D Convert.ToInt64m_queueIP.Dequeue()); //=EF=83=9F=C3=89tant un a=
dresse
IP en long
}
if(iIP =3D=3D 0)
continue;
PortScanner oPortScanner =3D new PortScanner(iIP);
oPortScanner.Scan();
}

class PortScanner
{
private AutoResetEvent m_oARSConnectDone =3D new AutoResetEvent(false);
private int m_iPort =3D 0;
private IPAddress m_oIPAddress;
private string m_sStatus =3D "Not connected";

public PortScanner(long iIP)
{
m_oIPAddress =3D new IPAddress(iIP);
m_iPort =3D 80;
}

public void Scan()
{
try
{
m_dtNow =3D DateTime.Now;
m_bTimeOut =3D false;
Socket oScanningIpPort =3D new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

oScanningIpPort.BeginConnect(new IPEndPoint(m_oIPAddress, m_iPort),
new AsyncCallback(ConnectCallback), oScanningIpPort);
if(!m_oARSConnectDone.WaitOne(6000, true))
{
oScanningIpPort.Close();
}
}
catch(SocketException ex)
{
Console.WriteLine(ex.ErrorCode);
}
}

private void ConnectCallback(IAsyncResult ar)
{
Socket oSocket =3D (Socket)ar.AsyncState;
try
{
// Complete the connection.
oSocket.EndConnect(ar);
m_sStatus =3D "Open";

//Sert =C3=A0 dire au main Thread que la connection s=E2=80=99est fait, d=
onc de
ne pas attendre 6 secondes
m_oARSConnectDone.Set();
}
catch
{
//La m=C3=A9thode EndConnect va faire un SocketException si le remote est
//atteignable mais refuse explicement la connection sur le port.
m_sStatus =3D "Close";
}
finally
{
if(oSocket !=3D null)
{
oSocket.Close();
oSocket=3Dnull;
}
Console.WriteLine(m_oIPAddress.ToString() + "=3D" + m_sStatus + " -->
Time : " + Convert.ToString(DateTime.Now - m_dtNow));
}
}


Merci de votre aide

1 réponse

Avatar
Paul Bacelar
<CODE>
if(iIP == 0)
continue;
</CODE>
Je ne rêve pas, c'est une attente active !!!!

Laisse tomber ton tableau de thread et utile le ThreadPool du FrameWork,
cela permettra de ne pas faire cette affreuse attente active qui perturbe
toute lecture de temps d'exécution.
--
Paul Bacelar
MVP VC++


"jgbid" wrote in message
news:
J'ai vraiment besoin d'aide, je vais virer fou si je travaille sur
ce problème encore plus d'une journée..

Je crois que mon problème vient du faite que j'utilise plus d'un
socket à la fois. Comme si lorsqu'il y a trop de threads exécutant
des sockets, ils ne fonctionnerait plus.
Mon code utilise la fonction BeginConnect avec un AutoResetEvent afin
de controler le timeout de connection et d'en fixer une limite
(exemple 5 sec)
Si j'utilise 1 seul Thread exécutant un Socket tout fonctionne
bien. (étant beaucoup trop long pour traiter des centaines de
milliers d'adresse IP).

Lorsque je met un chiffre plus grand que 1 (15, 25, 50, 100, etc..)
J'obtiens de faux résultats.

Tout fonctionne également bien si je met plusieurs Thread utilisant un
Connect plutôt qu'un BeginConnect, ou lorsque mon compteur attend la
fin de la connection avant de traiter autre chose
(AutoResetEventObj.WaitOne() au lieu de WaitOne(5000, true) pour 5 sec)


Par contre. c'est beaucoup trop long, si on prend l'exemple
d'un range de ip de 24.36.148.1 à 24.36.148.255, alors les
dernières connections dans ce cas-ci 250 à 255 prennent plus de 6
minutes à être exécuté.

Si on retourne à la première idée (la seule pouvant fonctionner
correctement) le résultat attendu serait
24.36.148.10=Close --> Time : 00:00:01.0781250
24.36.148.23=Close --> Time : 00:00:01.1406250
.
24.36.148.164=Close --> Time : 00:00:01.0781250
Ceci étant tout les ports ayant moins de 6 secondes (donc atteignable
mais ayant le port 80 fermé)

Les IP non atteignable devrait avoir comme résultat ceci :
24.36.148.82=Close --> Time : 00:00:06
24.36.148.83=Close --> Time : 00:00:06
.
.
Et finalement, la seule adresse IP entre 24.36.148.1 to 24.36.148.255
24.36.148.180=Open --> Time : 00:00:00.1093750

Voici ce que j'obtient avec plusieurs threads (donc plusieurs
sockets)
24.36.148.10=Close --> Time : 00:00:01.0781250 ? étant le seul
résultat obtenu..
les autres étant tous comme celui-ci
24.36.148.83=Close --> Time : 00:00:06
même l'adresse IP ayant le port 80 ouvert.
24.36.148.180=Close --> Time : 00:00:06


Je ne comprends vraiment pas pourquoi les autres sont tous à 6sec et
plus.
Comme si après 6 sec, lorsque je Close le socket, il ne serait pas
vraiment fermé. Alors, la connection en dedans de 6 secondes devient
alors impossible puisqu'il y a trop de socket ouvert. Mais comment
faire pour régler ce problème ???
J'ai essayer avec l'option ReuseAddress mais sans succès, j'ai
le même problème.
Je suis désespéré svp aidez moi !!!!!!

Voici mon code :
Je construit une Queue d'addresse IP (des milliers de ips)
Je crée un Array de Threads
Thread[] threadsRun = new Thread[ m_iMaxRunning ];
Où m_iMaxRunning doit être une valeur entre 1 et 250;
for(int nIndex = 0; nIndex < m_iMaxRunning; nIndex ++)
{
threadsRun[nIndex] = new Thread( new ThreadStart( HTTPScanRunFunction
) );
threadsRun[nIndex].Start();
}

Dans la fonction du Treahd HTTPScanRunFunction
Je boucle tant qu'il y a des ip à Dequeue
while(m_queueIP.Count > 0)
{
long iIP = 0;
lock(m_queueIP)
{
iIP = Convert.ToInt64m_queueIP.Dequeue()); //?Étant un adresse
IP en long
}
if(iIP == 0)
continue;
PortScanner oPortScanner = new PortScanner(iIP);
oPortScanner.Scan();
}

class PortScanner
{
private AutoResetEvent m_oARSConnectDone = new AutoResetEvent(false);
private int m_iPort = 0;
private IPAddress m_oIPAddress;
private string m_sStatus = "Not connected";

public PortScanner(long iIP)
{
m_oIPAddress = new IPAddress(iIP);
m_iPort = 80;
}

public void Scan()
{
try
{
m_dtNow = DateTime.Now;
m_bTimeOut = false;
Socket oScanningIpPort = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

oScanningIpPort.BeginConnect(new IPEndPoint(m_oIPAddress, m_iPort),
new AsyncCallback(ConnectCallback), oScanningIpPort);
if(!m_oARSConnectDone.WaitOne(6000, true))
{
oScanningIpPort.Close();
}
}
catch(SocketException ex)
{
Console.WriteLine(ex.ErrorCode);
}
}

private void ConnectCallback(IAsyncResult ar)
{
Socket oSocket = (Socket)ar.AsyncState;
try
{
// Complete the connection.
oSocket.EndConnect(ar);
m_sStatus = "Open";

//Sert à dire au main Thread que la connection s'est fait, donc de
ne pas attendre 6 secondes
m_oARSConnectDone.Set();
}
catch
{
//La méthode EndConnect va faire un SocketException si le remote est
//atteignable mais refuse explicement la connection sur le port.
m_sStatus = "Close";
}
finally
{
if(oSocket != null)
{
oSocket.Close();
oSocket=null;
}
Console.WriteLine(m_oIPAddress.ToString() + "=" + m_sStatus + " -->
Time : " + Convert.ToString(DateTime.Now - m_dtNow));
}
}


Merci de votre aide