PDA

Επιστροφή στο Forum : Ερώτηση για Visual Basic 6.0



lidia
10-09-05, 00:28
ήθελα να κάνω μια ερώτηση σχετικά με το πώς μπορώ μέσα από την VB να βρω το IP ενώς υπολογιστή συνδεδεμένο στο Internet με ρουτερ.

συγκεκριμένα δουλέυοντας με ένα winsock μπορώ και βρίσκω το IP αλλα ειναι το IP που το ρούτερ εχει δόσει στο λαν δικτυο τον υπολογιστών!υπάρχει κάποιος τρόπος να βρω το IP με κάποια άλλη εντολή και χωρίς να επισκεφθώ κανένα site από αυτά που δινουν το IP σου?

ευχαριστώ!

teacake
10-09-05, 01:07
Αυτό το πρόβλημα μοιάζει απλό σε πρώτη προσέγγιση, περιπλέκεται όμως αν λάβει κανείς υπόψη του ότι ένα PC μπορεί να έχει πολλές κάρτες δικτύου και κάθε μια μπορεί να έχει το δικό της IP address. Αν θεωρήσει κανείς ότι μιλάμε για μια κάρτα μόνο, τότε μπορείς να καλέσεις την CreateProcess με όρισμα cmd ipconfig, να κάνεις redirect το output σε ένα αρχείο, να περιμένεις να τελειώσει η εντολή (WaitForSingleObject) και μετά να το ανοίξης και να παρσάρεις το κείμενο. Υποθέτω ότι μιλάμε για σύστημα windows 2000 ή νεώτερο (NT class). Αυτή η λύση είναι προφανώς πολύ ευαίσθητη στη γλώσσα και στο output της εντολής ipconfig. Σε αντίθετη περίπτωση όμως πρέπει να μπλέξεις με ένα κάρο κλήσεις του RAS και του Internet API. Ψάξε και στα Google, msdn.microsoft.com για πιο συγκεκριμένες απαντήσεις και δες και το output της εντολής ipconfig.

Mitsaras
10-09-05, 04:11
Δεν έχω ασχοληθεί ιδιαίτερα με VB6.0 (μόνο με C/C++ & C#), αλλά νομίζω ότι υπάρχει ένα winsock object, το οποίο ίσως να μπορέσει να σε βοηθήσει σε αυτό που ψάχνεις.

Εναλλακτικά, θα σου πρότεινα να ψάξεις τα
1) COM (και να δεις αν υπάρχει κανένα component από εκεί που να κάνει αυτή τη δουλειά)
2) WMI (δεν είμαι σίγουρος που πρέπει να ψάξεις όμως!)

lidia
10-09-05, 16:16
μέσω της ipconfig δεν μπορείς να βρείς το εξωτερικό IP του Router το έχω δοκιμάσει!

sdikr
10-09-05, 16:20
ήθελα να κάνω μια ερώτηση σχετικά με το πώς μπορώ μέσα από την VB να βρω το IP ενώς υπολογιστή συνδεδεμένο στο Internet με ρουτερ.

συγκεκριμένα δουλέυοντας με ένα winsock μπορώ και βρίσκω το IP αλλα ειναι το IP που το ρούτερ εχει δόσει στο λαν δικτυο τον υπολογιστών!υπάρχει κάποιος τρόπος να βρω το IP με κάποια άλλη εντολή και χωρίς να επισκεφθώ κανένα site από αυτά που δινουν το IP σου?

ευχαριστώ!

Μπόρει και να κάνω λάθος, αλλά όσα προγράμματα εχω δεί που λένε το εξωτερικό ip κάνουν χρήση κάποιου server ή κάποιου Link για να το πάρουν

Προγράμματα σαν το Noip,dyndns,emule etc


Μέτα ο άλλος τρόπος θα ήταν να μπαίνεις μέσω telnet σε κάποιο ρουτερ ή μέσω snmp αλλά αυτό σημαίνει διαφορετικό setup για το κάθε ρουτερ

yiapap
11-09-05, 00:21
Μια quick 'n' dirty λύση είναι. Χρησιμοποιήσεις ένα Internet Explorer object (π.χ. οBrowser) (ή http winsock reader) και διαβάζεις το περιεχόμενο (oBrowser.InnerHTML) μιας σελίδας όπως το www.whatismyip.com.
Κάνεις parse το περιεχόμενο και παίρνεις το ip.
Αλλιώς μπορείς να διαβάσεις τον ίδιο τον router (είτε όπως παραπάνω μέσω web interface) είτε μέσω SNMP αν ο router το υποστηρίζει. Σε αυτή την περίπτωση βέβαια, ειδικά η 1η λύση είναι εντελώς router-specific, δλδ δε θαμπορέσεις να τη χρησιμοποιήσεις σε άλλο router (με το SNMP έχεις πολλές περισσότερες πιθανότητες).

Και SNMP access και HTTP readers θα βρεις άνετα στο Google με μια αναζήτηση

TTB
11-09-05, 00:42
Μια τραγικά lame λύση είναι να ρίξεις ένα msinet.ocx στη φόρμα σου και να κάνεις κάτι σαν:

Dim startstr As Integer
Dim endstr As Integer
Dim URL As String
Dim IP As String

URL = Inet1.OpenURL("http://www.whatismyip.com/")
startstr = InStr(1, URL, "<TITLE>Your IP Is ")
endstr = InStr(1, URL, " WhatIsMyIP.com</TITLE>")
IP = Mid(URL, startstr + 18, endstr - (startstr + 18))

Clipboard.Clear
Clipboard.SetText IP

Η IP είναι στο τώρα στο clipboard...μπλιαχ, αν σου αλλάξει το <TITLE> tag ο web master πάμε πάλι απο την αρχή.

Edit:
Ουπς, μόλις πρόσεξα ότι αυτή την λύση την απορίπτεις εξαρχής...άκυρο.

ReverseR
11-09-05, 00:49
Δεν πρέπει να υπάρχει λύση παιδιά, χωρίς χρήση εξωταιρκού server
http://xtremevbtalk.com/showthread.php?t=89250

TTB
11-09-05, 00:56
Και λογικά δεν υπάρχει λύση, ο client δεν έχει κανένα λόγο (που να μπορώ να σκεφτώ τουλάχιστον) να ξέρει πως δρομολογούνται τα πακέτα από και προς. Αν υποθέσουμε ότι τρέχει σε ένα εταιρικό δίκτυο με 3-4 hops τι θα πρέπει να κάνει; Η δρομολόγιση είναι καθαρά θέμα αρχιτεκτονικής δικτύωσης και όχι προγραμματισμού.

lidia
11-09-05, 11:06
με εξωτερικό τρόπο το εχω κάνει και εγώ!(με inet συγκεκριμένα)
απλός τώρα έχω το εξης προβλημα πως να συνδέσω 2 pc που βρισκονται πισω απο διαφορετικα routers μεσο internet με winsock! ούτε connect μπορώ να κάνω μιας και δεν κσέρω το IP ούτε listen γιατι υπάρχει το ρούτερ και μου κάνει προβλήματα!

ευχαριστώ για τις συμβουλές πάντος!

TTB
11-09-05, 11:45
Δεν πολυκαταλαβαίνω το πρόβλημα, για να συνδέσεις 2 PC ο initiator θα πρέπει να ξέρεi την εξωτερική IP router του listener (η κάποιος DNS να μπορεί να κάνει resolve με όνομα), από κει και πέρα θα πρέπει να ακολουθήσεις το δρόμο της δικτύωσης (port forwarding όπως όλος ο καλός κόσμος του p2p). Ακόμα και αν ο listener ήξερε τη δικιά του εξωτερική IP τι θα μπορούσε να κάνει παρά να περιμένει για socket open;

the_ar
12-09-05, 19:25
ήθελα να κάνω μια ερώτηση σχετικά με το πώς μπορώ μέσα από την VB να βρω το IP ενώς υπολογιστή συνδεδεμένο στο Internet με ρουτερ.

συγκεκριμένα δουλέυοντας με ένα winsock μπορώ και βρίσκω το IP αλλα ειναι το IP που το ρούτερ εχει δόσει στο λαν δικτυο τον υπολογιστών!υπάρχει κάποιος τρόπος να βρω το IP με κάποια άλλη εντολή και χωρίς να επισκεφθώ κανένα site από αυτά που δινουν το IP σου?

ευχαριστώ!

Μια πιο εύκολη λύση είναι να χρησιμοποιήσεις το MyIPTools.dll (http://www.a1vbcode.com/app-3445.asp). Αν δεν λειτουργεί το link ψάξε στο Google για το MyIPTools.dll.

Είναι γραμμένο για την VB6 και αυτός που το έγραψε ισχυρίζεται ότι κάνε τα εξής (δεν το έχω δοκιμάσει αλλά έπεσα πάνω του και με ενθουσίασε το τι μπορεί να κάνει):


API-DLL written in Visual Basic 6
Compiled with Make DLL's in Visual Basic - VB Addin V2.00 ©2004 DanSoft Australia.

CheckPing performs a ping to an IP
DetectIP detects your IP (even behind a router)
FormatIP formats an IP (as string) to xxx.xxx.xxx.xxx
FormatIPLong formats an IP (as long) to xxx.xxx.xxx.xxx
FullLocate calls ip infos on http://www.formyip.com/ipcountry_popup.php
GetHTML returns the HTML code of an URL
IP2Long converts an IP to a long value
IPLonginRange checks if an IP is in a specified range (all IPs are long values)
IPinRange checks if an IP is in a specified range (all IPs are strings)
IPtoHost resolves an IP to it's HostName
Locate calls ip infos on http://www.dnsstuff.com/tools/city.ch?ip=127.0.0.1
Long2IP converts a long value to an IP
ResolveHost resolves a HostName to it's IP
UpdateDynDNS updates a DynDNS service
UpdateNoIP updates a No-IP service
WhoIs calls ip infos on http://www.ripe.net/perl/whois?searchtext=127.0.0.1&alt_database=ALL
ftp_Transfer up-/downLoad of a file via FTP

Το (πιθανό) πρόβλημα θα υπάρξει αν θες να το χρησιμοποιήσεις σε εμπορική εφαρμογή.
Δεν ξέρω αν χρειάζεσαι άδεια για να το χρησιμοποιήσεις.
Για προσωπική χρήση δεν θα έχεις πρόβλημα.



Φιλικά,
Ανδρέας

DeadAtHeaven
12-09-05, 19:56
με εξωτερικό τρόπο το εχω κάνει και εγώ!(με inet συγκεκριμένα)
απλός τώρα έχω το εξης προβλημα πως να συνδέσω 2 pc που βρισκονται πισω απο διαφορετικα routers μεσο internet με winsock! ούτε connect μπορώ να κάνω μιας και δεν κσέρω το IP ούτε listen γιατι υπάρχει το ρούτερ και μου κάνει προβλήματα!

ευχαριστώ για τις συμβουλές πάντος!

Και να μάθεις το IP του router πάλι δε θα μπορέσεις να συνδεθείς στο άλλο PC. Το port forwarding δεν μπορεί να σε βοηθήσει σε αυτή τη περίπτωση.

Αν οι routers σου μπορούν να κάνουν Network Address Translation, τότε μπορείς να συνδέσεις τους υπολογιστές μεταξύ τους με συγκεκριμένα IP. Με τη χρήση του ΝΑΤ, ένας router ή ένα switch μπορεί να κάνει map μια σειρά απο "εξωτερικά" IP σε μια σειρά απο "εσωτερικά" IP.

Το θέμα τώρα είναι οτι με αυτό το τρόπο υπάρχει περιορισμένος αριθμός ταυτόχρονων συνδέσεων ανάλογος με τις διαθέσιμες IP. Αυτό αντιμετωπίζεται "εύκολα" στη περίπτωση που δεν χρειάζεται να διατηρείς τη σύνδεση. Δηλαδή Open-Transfer-Close, οπότε κάθε IP χρησιμοποιείται για ελάχιστο χρόνο απο κάθε χρήστη.

Ένας άλλος τρόπος είναι να δημιουργήσεις ένα relay server για την εφαρμογή σου ο οποίος θα είναι απάνω σε μια πραγματική IP όπου θα συνδέωντε όλοι οι clients (Λίγο δύσκολο ανάλογα με την εφαρμογή σου).

Mitsaras
12-09-05, 21:28
Και να μάθεις το IP του router πάλι δε θα μπορέσεις να συνδεθείς στο άλλο PC. Το port forwarding δεν μπορεί να σε βοηθήσει σε αυτή τη περίπτωση.

Αν οι routers σου μπορούν να κάνουν Network Address Translation, τότε μπορείς να συνδέσεις τους υπολογιστές μεταξύ τους με συγκεκριμένα IP. Με τη χρήση του ΝΑΤ, ένας router ή ένα switch μπορεί να κάνει map μια σειρά απο "εξωτερικά" IP σε μια σειρά απο "εσωτερικά" IP.

Το θέμα τώρα είναι οτι με αυτό το τρόπο υπάρχει περιορισμένος αριθμός ταυτόχρονων συνδέσεων ανάλογος με τις διαθέσιμες IP. Αυτό αντιμετωπίζεται "εύκολα" στη περίπτωση που δεν χρειάζεται να διατηρείς τη σύνδεση. Δηλαδή Open-Transfer-Close, οπότε κάθε IP χρησιμοποιείται για ελάχιστο χρόνο απο κάθε χρήστη.

Ένας άλλος τρόπος είναι να δημιουργήσεις ένα relay server για την εφαρμογή σου ο οποίος θα είναι απάνω σε μια πραγματική IP όπου θα συνδέωντε όλοι οι clients (Λίγο δύσκολο ανάλογα με την εφαρμογή σου).

Στα .net sockets τουλάχιστον, το μόνο που χρειάζεσαι, είναι αφού συνδεθεί ο client, να δώσεις το connection σε άλλο socket, και ν' αφήσεις το κεντρικό socket ανοιχτό για τους υπόλοιπους clients.

DeadAtHeaven
13-09-05, 11:43
Στα .net sockets τουλάχιστον, το μόνο που χρειάζεσαι, είναι αφού συνδεθεί ο client, να δώσεις το connection σε άλλο socket, και ν' αφήσεις το κεντρικό socket ανοιχτό για τους υπόλοιπους clients.

Έτσι λειτουργούν γενικά τα sockets σε οποιοδήποτε implementation.

Σε ποιό σημείο αναφέρεται η απάντηση σου;

Mitsaras
13-09-05, 18:16
"Το θέμα τώρα είναι οτι με αυτό το τρόπο υπάρχει περιορισμένος αριθμός ταυτόχρονων συνδέσεων ανάλογος με τις διαθέσιμες IP"

Υπέθεσα ότι μιλάμε για έναν server και αρκετούς Clients, όπου (τουλάχιστον) ο server βρίσκεται πίσω από firewall. Αν ισχύει αυτό, δε χρειάζεσαι μόνο μία IP? Διόρθωσέ με αν τυχόν κάνω λάθος, ή απλώς μπλεχτήκαμε!

DeadAtHeaven
14-09-05, 11:15
Υπέθεσα ότι μιλάμε για έναν server και αρκετούς Clients, όπου (τουλάχιστον) ο server βρίσκεται πίσω από firewall. Αν ισχύει αυτό, δε χρειάζεσαι μόνο μία IP? Διόρθωσέ με αν τυχόν κάνω λάθος, ή απλώς μπλεχτήκαμε!

Αναφερόμουν στη περίπτωση όπου συνδέεις δύο μηχανήματα σε στύλ P 2P τα οποία βρίσκονται πίσω απο router που κάνουν NAT.

Όσο αφορά τη δεύτερη λύση με τον "ενδιάμεσο" server, σαφώς το server socket δέχεται συνδέσεις και τις περνάει σε άλλα socket για να τις εξυπηρετήσουν.

lidia
14-09-05, 12:46
παιδια με router δεν γινεται σύνδεση αφου αν εχεις βάλεi ένα socket στο pc που βρίσκεται πίσω από το router να κάνει listen εστω σε μια πορτα 67890 και πας από ένα αλλο pc και κάνεις με ένα αλλο socket connect xxx.xxx.xxx.xxx, 67890 η σύνδεση δεν πραγματοποιητε ακόμα και αν έχω κάνει port forwarding στο router την 67890 στο εσωτερικό ip του pc στο λαν δικτυο!

οπου χχχ.χχχ.χχχ.χχχ το ΙP του router.

οποιος εχει καταφέρει να συνδέσει με winsock 2 pc μέσω internet ενώ παρεμβάλεται router ας μου πει τον τρόπο!

Mitsaras
14-09-05, 13:13
ΝΑΤ και σταθερές Ports

DeadAtHeaven
14-09-05, 14:41
παιδια με router δεν γινεται σύνδεση αφου αν εχεις βάλεi ένα socket στο pc που βρίσκεται πίσω από το router να κάνει listen εστω σε μια πορτα 67890 και πας από ένα αλλο pc και κάνεις με ένα αλλο socket connect xxx.xxx.xxx.xxx, 67890 η σύνδεση δεν πραγματοποιητε ακόμα και αν έχω κάνει port forwarding στο router την 67890 στο εσωτερικό ip του pc στο λαν δικτυο!

οπου χχχ.χχχ.χχχ.χχχ το ΙP του router.

οποιος εχει καταφέρει να συνδέσει με winsock 2 pc μέσω internet ενώ παρεμβάλεται router ας μου πει τον τρόπο!

lidia ο μέγιστος αριθμός που μπορείς να βάλεις στο port είναι 65536 και αυτό γιατί στο TCP πρωτόκολο υπάρχουν δύο bytes όπου αποθηκέυονται τα source and destination ports.

Το πιο πιθανό στη περίπτωση σου είναι να προσπαθείς να κάνεις σύνδεση σε κάποιο άλλο port. Tο μηχάνημα πιθανότατα προσπαθεί να συνδεθεί στο port 67890 mod 65536 = 2354, μπορείς να το επαληθεύσεις με ένα sniffer.

Με το port forwarding που λές θα έπρεπε κανονικά να μπορείς να συνδεθείς αλλά μάλλον φταίει το port. Θα έλεγα να το διορθώσεις και να ξαναδοκιμάσεις.

Αν θέλεις να δείς ποιά port είναι "ελεύθερα" (δηλαδή μπορεί να μη σου κάνουν conflict με κάποια άλλη υπηρεσία που μπορεί να τρέχει μέσα στο δίκτυο σου ή τους υπολογιστές που θα συνδεθούν. ) μπορείς να ρίξεις μια ματιά εδω:
http://www.iana.org/assignments/port-numbers

yiapap
14-09-05, 21:29
Νομίζω, έτσι που εξελίχθηκε η ερώτηση, ένας relay server (όπως προαναφέρθηκε) είναι απαραίτητος...
Σε αυτόν θα δρομολογούνται όλα τα αιτήματα προς συγκεκριμένη πόρτα και ο relay server με έναν απλό πίνακα (source ip | destination ip + port) θα κατευθύνει τα πακέτα.

lidia
14-09-05, 23:29
έστω οτι εχω βάλει μία άλλη port.και πάλι δεν μου γίνεται η σύνδεση!
το προβλημα είναι το εξής οταν το ένα winsock κάνει connect στο IP μπάινει μέσω του port forwarding στο pc.μετά όμως το άλλο winsock που κάνει listen δεν πάιρνει μυρωδία τίποτα μιας και η σύνδεση μετά το router δεν ξέρει σε ποιά πορτα του pc να ψαξει!

yiapap
15-09-05, 10:24
Μισό λεπτό βρε lidia.

Έστω PC1, PC2 (Winsock1, Winsock2)
Κάνεις από το PC1 connect στο IP 1.1.1.1 (Public IP) Port 1234
Το πακέτο σου "ταξιδεύει" μέχρι τον router του PC2
Στον router του PC2 πρέπει να έχεις φτιάξει έναν κανόνα που λέει ότι όλα τα πακέτα προς την πόρτα 1234 θα πηγαίνουν στο PC2 192.168.0.1 (Private IP) Port 1234
Έτσι το πακέτο σου φθάνει στο PC2 όπου το Winsock2 κάνει listen.

Αυτό το παράδειγμα το έχεις καταφέρει;

Πριν πάμε στο τι γίνεται όταν προσπαθούνε περισσότερα του ενός PC να συνδεθούν με το PC2 πρέπει αυτό να γίνεται σωστά.

DeadAtHeaven
15-09-05, 13:47
έστω οτι εχω βάλει μία άλλη port.και πάλι δεν μου γίνεται η σύνδεση!

Το θέμα δεν είναι να βάλεις ενα οποιαδήποτε port...το θέμα είναι να βάλεις ένα αριθμό <=65536 (και πιθανότατα >=7000)



το προβλημα είναι το εξής οταν το ένα winsock κάνει connect στο IP μπάινει μέσω του port forwarding στο pc.μετά όμως το άλλο winsock που κάνει listen δεν πάιρνει μυρωδία τίποτα μιας και η σύνδεση μετά το router δεν ξέρει σε ποιά πορτα του pc να ψαξει!

Κοίτα, τα πράγματα δε γίνονται ακριβώς έτσι. Αν το router είναι ρυθμισμένο σωστά (χωρίς να θέλω να πώ οτι δεν το έχεις ρυθμίσει σωστά) τότε απο τη στιγμή που η σύνδεση "περνάει" απο το router και γίνεται accept στο PC, θα λειτουργεί και προς τις δύο κατευθήνσεις.

Εκτός απο το παράδειγμα που σου αναφέρει o yiapap, αν έχεις δύο PC συνδεδεμένα με ένα καλώδιο, συνδέονται τα προγράματα;

Θα πρότεινα να κοιτάξεις και τις τοπικές ρυθμίσεις των υπολογιστών. Μήπως υπάρχει κάποιος κανόνας σε κανα firewall που κόβει τη συγκεκριμένη επικοινωνία;

yiapap
15-09-05, 13:51
Εκτός απο το παράδειγμα που σου αναφέρει o yiapap, αν έχεις δύο PC συνδεδεμένα με ένα καλώδιο, συνδέονται τα προγράματα;
Επίσης σωστό.
Δοκίμασε πρώτα να κάνεις την εφαρμογή να δουλέψει σε LAN και βγαίνεις μετά "προς τα έξω"

lidia
16-09-05, 02:16
σε lan μου εχει δουλέψει τέλεια!καθώς και μεσω internet μεσω dial up connection!
ισως να έχω κάνει κάποιο λάθος στο port forwarding!θα το κοιταξω και θα σας ξαναρωτήσω αν ειναι!

ευχαριστω!

lidia
30-10-05, 18:13
όποιος καλός άνθρωπος έχει καταφέρει να συνδέσει 2 pc με winsock μέσω internet ενώ παρεμβάλεται ρούτερ τον παρακαλώ να μου πει πώς γίνεται γιατί το χρειάζομαι άμεσα για ένα project!

UrL
03-12-09, 23:19
Private Sub cmdConnect_Click()
'
' To Winsock2 einai ena Client'
' To Winsock1 einai o Server opou tha steiloume kai tin aitisi sundesis'
'
Winsock2.RemoteHost = "localhost"
Winsock2.RemotePort = 13003
Winsock2.Connect
End Sub

Private Sub Form_Load()
'
' Winsock1 The 'Server' Listening on Port 13003
' gia aitisis sundesis
'
Winsock1.LocalPort = 13003
Winsock1.Listen
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
'
' Winsock1 'Server' tha labei ena mia aitisi sundesis
' opote to stamatame to listening kai kanoume accept tin aitisi sundesis
'
Winsock1.Close
Winsock1.Accept requestID
End Sub

Private Sub Winsock2_Connect()
'
' To Winsock1 o Server tha dextei tin aitisi sundesis
' opou vazoume ena MsgBox pou tha mas deixnei kai tin IP tou server
' kai to port number episis
'
MsgBox "Winsock2 has successfully connected to " & Winsock2.RemoteHostIP & " on Port " & Winsock2.RemotePort
End Sub

Kane port forwarding to port to opio tha valeis gia Remote Port!Have fun :cool:

@ ADSLgr.com All rights reserved.