2016-10-05 6 views
0

Я пытаюсь создать приложение Windows Form для сервера, но мой код вызывает ошибку 0x80004005 при вызове метода Listen. Что я делаю неправильно?Что я должен изменить, чтобы этот код прослушивал порт UDP?

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 " & ipEndPoint.Address.ToString & " port: " & ipEndPoint.Port) 

      UdpOpen = True 
     Catch ex As Exception 
      MessageBox.Show(ex.ToString()) 
     End Try 
    End If 
End Sub 

Edit: метод CallBack Public Sub AcceptCallback (ар Как IAsyncResult) Dim слушателем Как Гнездо = ​​Ничего

' 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 

ответ

0

Не просто выбрать первый IP-адрес в IPHostEntry.AddressList но поиск массива для адреса IPv4. См. Пример на this MSDN page.

+0

Я изменяю строку, определяющую переменную ipAddr, на Dim ipAddr. Как IPAddress = System.Net.IPAddress.Parse («127.0.0.1») и, похоже, работает, но открывает порт TCP, и мне нужен порт UDP. :( –

+0

Даже при использовании 'SocketType.Dgram' и' ProtocolType.UDP'? – rveerd

+0

Спасибо !, я изменился и, кажется, работает до тех пор, пока не вызвал метод Listen и не вызвал ошибку, потому что метод Listen недоступен для UDP. некоторые в Интернете и похоже, что процесс поместить сокет в режим прослушивания для UDP отличается от TCP, я делаю этот код на основе TCP-сервера. Теперь я пытаюсь использовать метод BeginAccept, но в CallBack возникает ошибка, потому что Метод EndAccept не возвращает asyncResult. –

Смежные вопросы