[VB6] netwerk scannen / winsock / gegevens uit txt file

Pagina: 1
Acties:

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Ik zou graag controleren of een aantal pc's aangesloten zijn op het netwerk. Op de server zou ik een tool willen laten draaien die om de x tijd even een connectie probeert te maken met elke pc. Dit wil ik doen mbv het winsock control in VB6.

Indien ik gewoon een connectie maak met 1 pc krijg ik mooi antwoord indien de connectie in orde is, of winsock1_error indien de connectie niet in orde is. De gegevens (hostname & port) van de pc's die ik wil controleren staan in gebruikers.txt

Ik lees dit bestand nu regel per regel uit en doe telkens winsock1.connect met de gegevens uit 1 regel, tot het bestand volledig is doorlopen. Het probleem is echter dat eerst deze lus volledig wordt doorlopen (tot het einde van het bestand is bereikt), eer de code verder gaat naar winsock1_error of winsock1_connect. Dus ik zie enkel de status van de pc die als laatste is opgenomen in het txt bestand.

Ik gebruik volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub cmdControleerStatus_click() 
    Dim nFile As Integer
    nFile = FreeFile
   
    If Dir$(App.Path & "\gebruikers.txt") = "" Then Exit Sub    'uit de sub springen indien het bestand niet bestaat
    Open App.Path & "\gebruikers.txt" For Input As #nFile       'bestand openen om te lezen
    
    Dim host, port As String                            'variabelen die de hostnaam & poortnr gaan bevatten
    
    While Not EOF(nFile)                                'blijven herhalen tot het volledige bestand is doorlopen
        Input #nFile, host, port                        'regel uit het betand uitlezen & in de variabelen plaatsen
        Winsock1.Close                                  'connectie sluiten (mocht deze nog open staan om één of andere reden)
        Winsock1.RemoteHost = host                      'zeggen met welke host de connectie gemaakt moet worden
        Winsock1.RemotePort = port                      'zeggen met welke poort connecteren
        Winsock1.Connect                                'connectie maken
    Wend
    
    Close #nFile                                        'bestand afsluiten
    
End Sub

Private Sub Winsock1_Connect()
    MsgBox "connectie is gemaakt"                       'eenvoudige melding indien connectie ok is
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox "error - geen connectie gemaakt"             'eenvoudige melding indien connectie niet ok is
End Sub


De code die ik gebruik om slechts 1 pc te controleren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub cmdControleerStatus_click()
    
        Winsock1.Close                                  'connectie sluiten (mocht deze nog open staan om één of andere reden)
        Winsock1.RemoteHost = "pcnaam"                  'zeggen met welke host de connectie gemaakt moet worden
        Winsock1.RemotePort = "80"                      'zeggen met welke poort connecteren
        Winsock1.Connect                                'connectie maken
    
End Sub

Private Sub Winsock1_Connect()
    MsgBox "connectie is gemaakt"                       'eenvoudige melding indien connectie ok is
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox "error - geen connectie gemaakt"             'eenvoudige melding indien connectie niet ok is
End Sub


Weet iemand hoe ik dit probleem kan oplossen? Na het inlezen winsock1.connect doen van 1 regel uit de lus moet er dus gewacht worden tot msgbox error of msgbox connect (later te vervangen door andere code).

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Je kijkt dus nu of er een WEB-server op die host draait. De pc kan aanstaan, maar zonder web-server krijg je nooit connectie op poort 80.

Kan je niet beter een ping sturen en de output in een textfile mikken?
code:
1
ping xxx.xxx.xxx.xxx >ping.txt

En dan die informatie je applicatie in trekken?

Ey!! Macarena \o/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je aanpak is "ram verkeerd" :P

Mogelijke oplossingen:
1) De ranzige oplossing: Plemp wat DoEvents in je while lus, maar dat wordt nooit stabiel en ik betwijfel of het uberhaupt gaat werken
2) Je moet in de _Connect en _Error events pas de volgende PC gaan "pingen" en dus niet in een While-lus.
3) Je maakt een (dynamische) array van Winsocks en zet ze allemaal aan 't werk. Zorg daarvoor dat je minimaal 1 winsock op je form het staan met index 0. Dan kun je vervolgens met Load(myWinsock(1)) de volgende laden en in gebruik nemen. Besef wel dat bij de events dan een index van de winsock wordt teruggegeven, dus je dient je events opnieuw aan te maken of aan te passen zodat de index parameter ook binnen kan komen.

[ Voor 47% gewijzigd door RobIII op 08-03-2006 15:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 10:32
Wat RobIII zegt in zijn 3e optie is verreweg het beste/netste. Hou er ook rekening mee dat in WinXP er een limiet zit aan het aantal "half-open" connecties (default 10 stuks dacht ik), dus daar ga je tegenaan lopen als je meer dan 10 connecties "pending" hebt staan. En inderdaad, port 80 staat natuurlijk alleen open als er een webserver aktief is op de PC die je wilt connecten...

Zoals jouw code nu is, wordt iedere connectie inderdaad direkt weer afgebroken voor de volgende....

[ Voor 15% gewijzigd door DigiK-oz op 08-03-2006 15:47 ]

Whatever


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
@RaZ
met ping werken zou ook wel gaan, maar uit andere topics leek het me dat het gebruik van winsock beter was voor zulke toepassingen.

En in dit voorbeeld maak ik gebruik van poort 80, maar daar kan ik ook wel een andere waarde voor nemen.

@RobIII
De volgende pc pingen in de _error of _connect sub wou ik ook al doen, maar hoe kan ik van daar uit de volgende regel uit de txt lezen? dim nFile as integer kan ik wel globaal declareren, maar nFile = freefile moet in een sub staan. Input #nFile ..... gaat dus een fout geven in een andere sub (tenzij ik het bestand daar terug open, maar dan begin ik weer vanaf de 1ste regel te lezen)

Ofwel zie ik de eenvoudige oplossing even niet

[edit] had optie3 nog niet gezien. Dat zal ik even bekijken. Bedankt voor de info al

[ Voor 7% gewijzigd door mmy841 op 08-03-2006 15:49 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sloompie schreef op woensdag 08 maart 2006 @ 15:46:
Wat RobIII zegt in zijn 3e optie is verreweg het beste/netste. Hou er ook rekening mee dat in WinXP er een limiet zit aan het aantal "half-open" connecties (default 10 stuks dacht ik), dus daar ga je tegenaan lopen als je meer dan 10 connecties "pending" hebt staan. En inderdaad, port 80 staat natuurlijk alleen open als er een webserver aktief is op de PC die je wilt connecten...
Ik zou persoonlijk voor de 2e optie gaan (mede om wat jij aangeeft van de beperkingen) en heel misschien een kruising van optie 2 en 3.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Zolang je het niet te moeilijk maakt en bijv. heel veel PC's wilt gaan checken dan lijkt onderstaande me wel afdoende.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
Public bContinue as Boolean

Private Sub cmdControleerStatus_click() 
    Dim nFile As Integer
    nFile = FreeFile
   
    If Dir$(App.Path & "\gebruikers.txt") = "" Then Exit Sub    'uit de sub springen indien het bestand niet bestaat
    Open App.Path & "\gebruikers.txt" For Input As #nFile       'bestand openen om te lezen
    
    Dim host As String
    Dim port As String                            'variabelen die de hostnaam & poortnr gaan bevatten
    
    While Not EOF(nFile)                                'blijven herhalen tot het volledige bestand is doorlopen
        Input #nFile, host, port                        'regel uit het betand uitlezen & in de variabelen plaatsen
        Winsock1.Close                                  'connectie sluiten (mocht deze nog open staan om één of andere reden)
        Winsock1.RemoteHost = host                      'zeggen met welke host de connectie gemaakt moet worden
        Winsock1.RemotePort = port                      'zeggen met welke poort connecteren

        bContinue=False
        Winsock1.Connect                                'connectie maken
        Do While bContinue=False
           DoEvents
        Loop
    Wend
    
    Close #nFile                                        'bestand afsluiten
    
End Sub

Private Sub Winsock1_Connect()
    MsgBox "connectie is gemaakt"                       'eenvoudige melding indien connectie ok is
    bContinue=True
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox "error - geen connectie gemaakt"             'eenvoudige melding indien connectie niet ok is
    bContinue=True
End Sub


Ik zou bvk nog wel er aan toe voegen dat als het wachten op bContinue=True langer duurt dan bijv. 2 seconden dat je dan een Timeout melding krijgt ofzo. Maar dat moet je zelf maar even opzoeken.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 10:32
Yup, is het makkelijkste, maar levert je wel 100% cpu bezetting op zo ongeveer. Maar met een timeout op bContinue, en niet heel veel systemen, gaat dit quick-and-dirty wel doen wat TS wil.

Whatever


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
heb m'n code even aangepast dat de volgende regel wordt uitgelezen na de events _connect of _error. Dit lijkt wel te werken als ik dim nFile as integer globaal doe en nFile = freefile in de sub achter de knop. Nu ik even logisch nadenk is dat normaal. In de sub geef ik een waarde aan de variabele, en die blijft dan in de variabele voor elke sub. Dom van me... |:(

Ik ga het zo even verder proberen & ook nog wel de code van Remark eens testen. Dan kan ik nog beslissen met welke ik verder ga.

Bedankt voor de snelle en duidelijke reacties

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 08 maart 2006 @ 15:54:
Zolang je het niet te moeilijk maakt en bijv. heel veel PC's wilt gaan checken dan lijkt onderstaande me wel afdoende.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
Public bContinue as Boolean

Private Sub cmdControleerStatus_click() 
    Dim nFile As Integer
    nFile = FreeFile
   
    If Dir$(App.Path & "\gebruikers.txt") = "" Then Exit Sub    'uit de sub springen indien het bestand niet bestaat
    Open App.Path & "\gebruikers.txt" For Input As #nFile       'bestand openen om te lezen
    
    Dim host As String
    Dim port As String                            'variabelen die de hostnaam & poortnr gaan bevatten
    
    While Not EOF(nFile)                                'blijven herhalen tot het volledige bestand is doorlopen
        Input #nFile, host, port                        'regel uit het betand uitlezen & in de variabelen plaatsen
        Winsock1.Close                                  'connectie sluiten (mocht deze nog open staan om één of andere reden)
        Winsock1.RemoteHost = host                      'zeggen met welke host de connectie gemaakt moet worden
        Winsock1.RemotePort = port                      'zeggen met welke poort connecteren

        bContinue=False
        Winsock1.Connect                                'connectie maken
        Do While bContinue=False
           DoEvents
        Loop
    Wend
    
    Close #nFile                                        'bestand afsluiten
    
End Sub

Private Sub Winsock1_Connect()
    MsgBox "connectie is gemaakt"                       'eenvoudige melding indien connectie ok is
    bContinue=True
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox "error - geen connectie gemaakt"             'eenvoudige melding indien connectie niet ok is
    bContinue=True
End Sub


Ik zou bvk nog wel er aan toe voegen dat als het wachten op bContinue=True langer duurt dan bijv. 2 seconden dat je dan een Timeout melding krijgt ofzo. Maar dat moet je zelf maar even opzoeken.
Hoewel het een leuk gevonden oplossing is, zeker voor een "mini-projectje" ofzo, is dit ranzig in het kwadraat, dat snap je neem ik aan ook? ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Maar het is natuurlijk ook een mini projectje, tenminste daar ben ik maar van uit gegaan ;)

Als je overigens de DoEvents aanvult met een Sleep van 100ms ofzo en de Timeout inbouwt kan er verder niet veel mis gaan.

Zodra het wat serieuzer wordt zou ik ook niet meer die standaard Winsock control gaan gebruiken maar een wat meer door ontwikkelde variant zoals Catalyst Socketwrench (er is ook een free edition).

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-04 20:01
[quote]Verwijderd schreef op woensdag 08 maart 2006 @ 16:50:
Als je overigens de DoEvents aanvult met een Sleep van 100ms ofzo en de Timeout inbouwt kan er verder niet veel mis gaan.
Behalve dan dat je nog een keer op de knop kan drukken en vervolgens alles in de soep loopt :O

DoEvents is evil

[ Voor 13% gewijzigd door farlane op 08-03-2006 17:30 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Dan Disable je toch die knop terwijl je bezig bent. Er is helemaal niets mis met DoEvents zolang je maar een beetje oplet.

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Nog even ter aanvulling...De tool zou moeten dienen om toch wel makkelijk 30 pc's te controleren op aan- of afwezigheid. Achteraf wordt het project uitgebreid om aangepaste commando's te sturen naar een telefooncentrale, ... Dus ik hou het maar bij de meest vlotte oplossing met zo weinig mogelijk belasting.

Maar ik heb wel nog een klein vraagje. In mijn voorbeeld scande ik op poort 80. Ik heb ook al geprobeerd te scannen op poort 7 (zou "echo" moeten zijn) of op een poort tussen 1024 en 65535 (poorten niet gebruikt door applicaties). Van enkele pc's krijg ik respons, van andere weer niet (die ik overigens wel kan pingen). De (windows / softwarematige )firewall op die pc's staat af, of de poorten zijn toegevoegd aan de veilige lijst. Ofwel blokt een andere (hardware) firewall deze connectie, maar dat lijkt me gek omdat de pc's in hetzelfde netwerk zijn opgenomen.

Ik moet wel toegeven dat ik gisteren niet meer veel tijd heb gehad om verder te zoeken & te testen. Dat kan ik deze voormiddag nog wat doen.

In ieder geval nogmaals bedankt voor de reacties

Verwijderd

Hier is een linkje naar code om met VB te pingen
http://vbnet.mvps.org/index.html?code/internet/ping.htm

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-04 20:01
Verwijderd schreef op woensdag 08 maart 2006 @ 17:36:
Dan Disable je toch die knop terwijl je bezig bent. Er is helemaal niets mis met DoEvents zolang je maar een beetje oplet.
Er is van alles mis met DoEvents, en er is geen enkele reden om het te gebruiken. Je hebt het alleen nodig als je software verkeerd in elkaar zit.
VB is niet bedoeld om multithreaded apps mee te bouwen, en DoEvents verandert daar niets aan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
@Remark
bedankt voor de voorbeeldcode. Maar volgens de omschrijving werkt dit voorbeeld enkel als ik het IP adres effectief ken. In een DHCP omgeving is dit dus niet erg handig, tenzij ik eerst via de hostnaam het IP adres probeer uit te lezen.

Maar ik ga de code zeker nog bekijken & wat verder opzoeken ivm de poorten

[edit] het voorbeeldprogramma werk goed, maar dus enkel indien het IP nummer wordt ingegeven...

[edit2] oeps, echt erover gekeken...(ping op hostname)

[ Voor 21% gewijzigd door mmy841 op 09-03-2006 10:00 ]


Verwijderd

Op dezelfde site zoeken naar ping geeft ook code om op hostname te pingen
Pagina: 1