Что я должен изменить, чтобы этот код прослушивался через UDP-порт?

#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. Я добавляю код обратного вызова к этому сообщению