![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
_Click |
|
|||
Unregistered |
Подскажите как в VB.Net написать аналог команды ping.
|
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
не думаю, что есть готовое решение, придется разбираться с протоколом ICPM и System.Net.Sockets
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
For |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.9.2003 Репутация: нет Всего: нет |
Уже искал и спрашивал........Не на одном форуме......Ответов так и не получил нигде
![]() |
|||
|
||||
Stas |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 3.6.2002 Репутация: нет Всего: нет |
Что-то похожее мне подсказали, правда обрабытывается посылка только первого покета, отсальные возвращают значение 0 (почему-то)! Да и первый пакет возврящает слишком большое значение (как-будто).
В коде пока не разобрался, может кто подскажет что к чему и доведет до ума. Option Explicit On Imports System Imports System.Net Imports System.Net.Sockets Public Class clsPing Public Structure stcError Dim Number As Integer Dim Description As String End Structure Public Const PING_SUCCESS As Long = 0 Public Const PING_ERROR As Long = (-1) Public Const PING_ERROR_BASE As Long = &H8000 Public Const PING_ERROR_HOST_NOT_FOUND As Long = PING_ERROR_BASE + 1 Public Const PING_ERROR_SOCKET_DIDNT_SEND As Long = PING_ERROR_BASE + 2 Public Const PING_ERROR_HOST_NOT_RESPONDING As Long = PING_ERROR_BASE + 3 Public Const PING_ERROR_TIME_OUT As Long = PING_ERROR_BASE + 4 Private Const ICMP_ECHO As Integer = 8 Private Const SOCKET_ERROR As Integer = -1 Private udtError As stcError Private Const intPortICMP As Integer = 7 Private Const intBufferHeaderSize As Integer = 8 Private Const intPackageHeaderSize As Integer = 28 Private intDataSize As Byte Private ipheLocalHost As System.Net.IPHostEntry Private ipheHost As System.Net.IPHostEntry Public Property DataSize() As Byte Get Return intDataSize End Get Set(ByVal Value As Byte) intDataSize = Value End Set End Property Public ReadOnly Property Identifier() As Byte Get Return 0 End Get End Property Public ReadOnly Property Sequence() As Byte Get Return 0 End Get End Property Public ReadOnly Property LocalHost() As System.Net.IPHostEntry Get Return ipheLocalHost End Get End Property Public Property Host() As Object Get Return ipheHost End Get Set(ByVal Value As Object) If (Value.GetType.ToString.ToLower = "system.string") Then Try ipheHost = System.Net.Dns.GetHostByName(Value) Catch ipheHost = Nothing udtError.Number = PING_ERROR_HOST_NOT_FOUND udtError.Description = "Host " & _ ipheHost.HostName & " not found." End Try ElseIf (Value.GetType.ToString.ToLower = "system.net.iphostentry") Then ipheHost = (Value) Else ipheHost = Nothing End If End Set End Property Public Sub New() intDataSize = 32 udtError = New stcError() ipheLocalHost = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()) ipheHost = Nothing End Sub Public Function Ping() As Long Dim intCount As Integer Dim aReplyBuffer(255) As Byte Dim intNBytes As Integer = 0 Dim intEnd As Integer Dim intStart As Integer Dim epFrom As System.Net.EndPoint Dim epServer As System.Net.EndPoint Dim ipepServer As System.Net.IPEndPoint ipepServer = New System.Net.IPEndPoint(ipheHost.AddressList(0), 0) epServer = CType(ipepServer, System.Net.EndPoint) epFrom = New System.Net.IPEndPoint(ipheLocalHost.AddressList(0), 0) DataSize = Convert.ToByte(DataSize + intBufferHeaderSize) If (DataSize Mod 2 = 1) Then DataSize += Convert.ToByte(1) End If Dim aRequestBuffer(DataSize - 1) As Byte '* --- ICMP Echo Header Format --- '* (first 8 bytes of the data buffer) '* '* Buffer (0) ICMP Type Field '* Buffer (1) ICMP Code Field '* (must be 0 for Echo and Echo Reply) '* Buffer (2) checksum hi '* (must be 0 before checksum calc) '* Buffer (3) checksum lo '* (must be 0 before checksum calc) '* Buffer (4) ID hi '* Buffer (5) ID lo '* Buffer (6) sequence hi '* Buffer (7) sequence lo '* Buffer (8)..(n) Ping Data aRequestBuffer(0) = Convert.ToByte(ICMP_ECHO) BitConverter.GetBytes(Identifier).CopyTo(aRequestBuffer, 4) BitConverter.GetBytes(Sequence).CopyTo(aRequestBuffer, 6) Dim i As Integer For i = 8 To DataSize - 1 aRequestBuffer(i) = Convert.ToByte(i Mod 8) Next i Call CreateChecksum(aRequestBuffer, _ DataSize, _ aRequestBuffer(2), _ aRequestBuffer(3)) Try Dim sckSocket As New System.Net.Sockets.Socket( _ Net.Sockets.AddressFamily.InterNetwork, _ Net.Sockets.SocketType.Raw, _ Net.Sockets.ProtocolType.Icmp) sckSocket.Blocking = False intStart = System.Environment.TickCount sckSocket.SendTo(aRequestBuffer, _ 0, _ DataSize, _ SocketFlags.None, _ ipepServer) intNBytes = sckSocket.ReceiveFrom(aReplyBuffer, _ SocketFlags.None, _ epServer) intEnd = System.Environment.TickCount If (intNBytes > 0) Then udtError.Number = (aReplyBuffer(19) * &H100) + aReplyBuffer(20) Select Case aReplyBuffer(20) Case 0 : udtError.Description = "Success" Case 1 : udtError.Description = "Buffer too Small" Case 2 : udtError.Description = "Destination Unreahable" Case 3 : udtError.Description = "Dest Host Not Reachable" Case 4 : udtError.Description = "Dest Protocol Not Reachable" Case 5 : udtError.Description = "Dest Port Not Reachable" Case 6 : udtError.Description = "No Resources Available" Case 7 : udtError.Description = "Bad Option" Case 8 : udtError.Description = "Hardware Error" Case 9 : udtError.Description = "Packet too Big" Case 10 : udtError.Description = "Reqested Timed Out" Case 11 : udtError.Description = "Bad Request" Case 12 : udtError.Description = "Bad Route" Case 13 : udtError.Description = "TTL Exprd In Transit" Case 14 : udtError.Description = "TTL Exprd Reassemb" Case 15 : udtError.Description = "Parameter Problem" Case 16 : udtError.Description = "Source Quench" Case 17 : udtError.Description = "Option too Big" Case 18 : udtError.Description = "Bad Destination" Case 19 : udtError.Description = "Address Deleted" Case 20 : udtError.Description = "Spec MTU Change" Case 21 : udtError.Description = "MTU Change" Case 22 : udtError.Description = "Unload" Case Else : udtError.Description = "General Failure" End Select End If Return (intEnd - intStart) Catch oExcept As Exception ' End Try End Function Public Function GetLastError() As stcError Return udtError End Function Private Sub CreateChecksum(ByRef data() As Byte, _ ByVal Size As Integer, _ ByRef HiByte As Byte, _ ByRef LoByte As Byte) Dim i As Integer Dim chk As Integer = 0 For i = 0 To Size - 1 Step 2 chk += Convert.ToInt32(data(i) * &H100 + data(i + 1)) Next chk = Convert.ToInt32((chk And &HFFFF&) + Fix(chk / &H10000&)) chk += Convert.ToInt32(Fix(chk / &H10000&)) chk = Not (chk) HiByte = Convert.ToByte((chk And &HFF00) / &H100) LoByte = Convert.ToByte(chk And &HFF) End Sub End Class |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |