#vb.net #sockets #server #udp #vb.net-2010
#vb.net #сокеты #сервер #udp #vb.net-2010
Вопрос:
Я пытаюсь создать серверное приложение Windows Form, но мой код выдает ошибку 0x80004005 при вызове метода Listen . Что я делаю не так?
Private Sub StartUdpReceiveThread(ByVal Puerto As Integer)
If Not UdpOpen Then
Try
permission = New SocketPermission(NetworkAccess.Accept, TransportType.Udp, "", SocketPermission.AllPorts)
sListener = Nothing
permission.Demand()
'Dim ipHost As IPHostEntry = Dns.GetHostEntry("")
Dim ipAddr As IPAddress = IPAddress.Any
ipEndPoint = New IPEndPoint(ipAddr, CInt(Me.PuertoEscuchaLbl.Text))
'sListener = New Socket(ipAddr.AddressFamily, SocketType.Unknown, ProtocolType.Udp)
sListener = New Socket(ipAddr.AddressFamily, SocketType.Dgram, ProtocolType.UDP)
' Associates a Socket with a local endpoint
sListener.Bind(ipEndPoint)
sListener.Listen(5)
' Begins an asynchronous operation to accept an attempt
Dim aCallback As New AsyncCallback(AddressOf AcceptCallback)
sListener.BeginAccept(aCallback, sListener)
PrintLog("Server listening on " amp; ipEndPoint.Address.ToString amp; " port: " amp; ipEndPoint.Port)
UdpOpen = True
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End If
End Sub
Редактировать:
Метод обратного вызова
Public Sub AcceptCallback(ar как IAsyncResult)
Тусклый слушатель как сокет = ничего
' A new Socket to handle remote host communication
Dim handler As Socket = Nothing
Try
' Receiving byte array
Dim buffer As Byte() = New Byte(1023) {}
' Get Listening Socket object
listener = DirectCast(ar.AsyncState, Socket)'<-- Here raises an error
' Create a new socket
handler = listener.EndAccept(ar)
handler.NoDelay = False
' Creates one object array for passing data
Dim obj As Object() = New Object(1) {}
obj(0) = buffer
obj(1) = handler
handler.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf ReceiveCallback), obj)
' Begins an asynchronous operation to accept an attempt
Dim aCallback As New AsyncCallback(AddressOf AcceptCallback)
listener.BeginAccept(aCallback, listener)
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub
Ответ №1:
Не просто выбирайте первый IP-адрес, IPHostEntry.AddressList
но ищите в массиве IPv4-адрес. Смотрите пример на этой странице MSDN.
Комментарии:
1. Я меняю строку, которая определяет переменную ipAddr, на Dim ipAddr как IPAddress = System.Net . IP-адрес. Синтаксический анализ («127.0.0.1») и, похоже, работает, но открывает TCP-порт, а мне нужен UDP-порт. 🙁
2. Даже при использовании
SocketType.Dgram
иProtocolType.UDP
?3. Спасибо!, Я изменил и, похоже, работает, пока я не вызову метод Listen и не выдам ошибку, потому что метод Listen недоступен для UDP. Я прочитал кое-что в Интернете, и кажется, что процесс перевода сокета в режим прослушивания для UDP отличается от TCP, я делаю этот код на основе TCP-сервера. Теперь я пытаюсь использовать вместо этого метод BeginAccept, но при обратном вызове возникает ошибка, потому что метод EndAccept не возвращает AsyncResult .
4. Извините, я имею в виду, что я пробовал с помощью BeginAccept и не работает, теперь я пытаюсь с помощью BeginConnect. Я добавляю код обратного вызова к этому сообщению