|
-
Mar 7th, 2007, 09:37 PM
#1
Thread Starter
Junior Member
Testing Access Method using Sockets (SSH,TELNET)
I need to parse a list of IPaddresses and determin if they are using SSH (port 22) or telnet (port 23). The best way I can think to do this is by attempting to open a socket (not the full connection). If port 22 is refused it's not SSH, then try port 23. The big problem is that there are 5000 entries in this list and I can't wait for the default timeout for each socket to determine the access method. That would be a total of 10,000 connection attempts and a complete waste of the users day!
Any help would be greatly appreciated.
P.S. I'm using VB 2005
Last edited by Tonyf84; Mar 12th, 2007 at 03:09 PM.
Reason: Adding Language
-
Mar 12th, 2007, 03:03 PM
#2
Thread Starter
Junior Member
Re: Testing Access Method (SSH,TELNET)
Here's what I have so far...It always comes back as Telnet though.
VB Code:
For Z = 1 To NumRows
ProgressBar2.Value = Z
ipaddr = Hostlist(Z, 0)
System.Windows.Forms.Application.DoEvents()
Try
Using tcpClient
tcpClient.Connect(ipaddr, 23)
ProgressBar1.Value = 1
isConnected = tcpClient.Connected
tcpclient.close
End Using
Catch ex As Exception
End Try
Select Case isConnected
Case True
Hostlist(Z, 2) = "Telnet"
Case False
ProgressBar1.Value = 2
Try
Using tcpClient
tcpClient.Connect(ipaddr, 22)
ProgressBar1.Value = 1
isConnected = tcpClient.Connected
tcpclient.close
End Using
Catch ex As Exception
End Try
If isConnected = True Then
Hostlist(Z, 2) = "SSH"
Else : Hostlist(Z, 2) = "ERR"
End If
End Select
Next
Last edited by Tonyf84; Mar 12th, 2007 at 03:07 PM.
-
Mar 18th, 2007, 03:43 PM
#3
Thread Starter
Junior Member
Re: Testing Access Method using Sockets (SSH,TELNET)
I find it hard to believe that nobody has the skills to solve this problem. Is there another reason there are no responses?
-
Mar 19th, 2007, 01:40 PM
#4
Re: Testing Access Method using Sockets (SSH,TELNET)
Your code is the reverse of your stated goal. The code first checks to see if the server accepts a telnet connection. If it does, whether the server accepts a SSH connection or not, the code says it's telnet. Try changing your code to match your goal.
As far as the time it takes to run through 5,000 addresses, that's how long it's going to take. You can't make 60 minutes take less than an hour, and you can't make 5,000 timeouts happen in less than 5,000 * <the time of one timeout>.
The most difficult part of developing a program is understanding the problem.
The second most difficult part is deciding how you're going to solve the problem.
Actually writing the program (translating your solution into some computer language) is the easiest part.
Please indent your code and use [HIGHLIGHT="VB"] [/HIGHLIGHT] tags around it to make it easier to read.
Please Help Us To Save Ana
-
Mar 20th, 2007, 04:20 PM
#5
Thread Starter
Junior Member
Re: Testing Access Method using Sockets (SSH,TELNET)
Thanks for the response.
Actually, if you look at it, it tries telnet, if it connects then it calls it telnet. If it doesn't connect, it tries ssh. If ssh succeeds, it calls it ssh. The problem turned out to be that I wasn't assigning isConnected = "" so on the next iteration of the loop, it already thought it was connected and therefore everyting else after that was deemed to be telnet. I'll paste in my current working code. As for the hour taking less than an hour. Well I don't agree with you. First, there could be some code optimization that would make the routine faster. Secondly, the answer for making 60min = 30min lies in multithreading. I plan to implement that sometime in the next few weeks.
Also, on our network the devices are either telnet with SSH disabled or SSH with Telnet disabled, so there's no reason to continue if the device responds to Telnet.
In addition, You'd be correct about not being able to change the time it takes to iterate through 5000 timeouts * 20seconds (the default) if you simply relied on default timeouts. I managed to speed things up significantly by pinging the device first using a 500 millisecond timeout (since there's no way to change the TCP Connect timeout). If the device doesn't respond, I assume it's dead and move to the next without ever trying to connect to it, so I've just reduced the time from 20 seconds to 1/2 second.
And for those who care (and there weren't many) here is the code that works. I hope that someone having similar issues in future finds it useful:
vb Code:
Friend Sub ParseList()
Dim Hostlist(10000, 2) As String
Dim temp, Path As String
Dim CurrentField As String
Dim CurrentRow As String()
Dim X, Y, NumRows, Z As Integer
Dim tcpClient As New System.Net.Sockets.TcpClient()
Dim isConnected, HostAvailable As Boolean
Dim ipaddr As String
With ProgressBar2
.Show()
.Style = ProgressBarStyle.Continuous
.Minimum = 0
.Maximum = 10000
.Value = 0
End With
Path = App_Path()
Using HostReader As FileIO.TextFieldParser = My.Computer.FileSystem.OpenTextFieldParser(Path & "hostlist.txt")
HostReader.SetDelimiters(vbTab)
While Not HostReader.EndOfData
temp = HostReader.ReadFields.ToString
X = X + 1
ProgressBar2.Value = X
System.Windows.Forms.Application.DoEvents()
NumRows = X
End While
End Using
ProgressBar2.Hide()
ReDim Hostlist(X, 2)
X = 0
Y = 0
With ProgressBar2
.Show()
.Style = ProgressBarStyle.Continuous
.Minimum = 0
.Maximum = 10000
.Value = 0
End With
Using HostReader As FileIO.TextFieldParser = My.Computer.FileSystem.OpenTextFieldParser(Path & "hostlist.txt")
HostReader.TextFieldType = FileIO.FieldType.Delimited
HostReader.SetDelimiters(vbTab)
While Not HostReader.EndOfData
CurrentRow = HostReader.ReadFields
For Each CurrentField In CurrentRow
Hostlist(X, Y) = CurrentField
Y += 1
Next
X += 1
Y = 0
ProgressBar2.Value = X
System.Windows.Forms.Application.DoEvents()
End While
End Using
PictureBox2.Show()
ProgressBar2.Value = 0
X = 0
Y = 0
With ProgressBar2
.Show()
.Style = ProgressBarStyle.Continuous
.Minimum = 0
.Maximum = NumRows
.Value = 0
End With
With ProgressBar1
.Show()
.Style = ProgressBarStyle.Continuous
.Minimum = 0
.Maximum = 2
.Value = 0
End With
Label1.Visible = True
Label2.Visible = True
For Z = 1 To NumRows
ProgressBar2.Value = Z
ipaddr = Hostlist(Z, 0)
Label2.Text = "Currently Processing: " & Z.ToString & " of " & NumRows.ToString
System.Windows.Forms.Application.DoEvents()
Try
HostAvailable = My.Computer.Network.Ping(ipaddr, 500)
Catch ex As Exception
End Try
If HostAvailable = True Then
Try
Using tcpClients As New TcpClient
Label1.Text = "Trying: " & ipaddr & " On " & "Port 23"
ProgressBar1.Value = 2
System.Windows.Forms.Application.DoEvents()
tcpClients.Connect(ipaddr, 23)
isConnected = tcpClients.Connected
System.Windows.Forms.Application.DoEvents()
End Using
Catch ex As Exception
Select Case Err.Number
Case 5
isConnected = False
Case Else
MsgBox(Err.Number)
End Select
End Try
Select Case isConnected
Case True
Hostlist(Z, 2) = "Telnet"
ProgressBar1.Value = 0
Case False
ProgressBar1.Value = 2
Try
Using TcpClients As New TcpClient
Label1.Text = "Trying: " & ipaddr & " On " & "Port 22"
ProgressBar1.Value = 2
System.Windows.Forms.Application.DoEvents()
TcpClients.Connect(ipaddr, 22)
isConnected = TcpClients.Connected
System.Windows.Forms.Application.DoEvents()
End Using
Catch ex As Exception
Select Case Err.Number
Case 5
isConnected = False
Case Else
MsgBox(Err.Number)
End Select
End Try
If isConnected = True Then
Hostlist(Z, 2) = "SSH"
isConnected = Nothing
Else : Hostlist(Z, 2) = "ERR"
End If
End Select
End If
'Debug.Print(Z & " " & Hostlist(Z, 0) & " " & Hostlist(Z, 2))
Next
PictureBox3.Show()
System.Windows.Forms.Application.DoEvents()
End Sub
Last edited by Tonyf84; Mar 20th, 2007 at 04:34 PM.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|