【问题标题】:What I must change to make this code listen on UDP port?我必须更改什么才能使此代码在 UDP 端口上侦听?
【发布时间】:2016-10-05 18:23:09
【问题描述】:

我正在尝试创建服务器 Windows 窗体应用程序,但我的代码在调用 Listen 方法时抛出 0x80004005 错误。 我做错了什么?

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

编辑: 回调方法 公共子 AcceptCallback(ar As IAsyncResult) Dim listener As Socket = Nothing

    ' 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

【问题讨论】:

    标签: vb.net sockets server udp vb.net-2010


    【解决方案1】:

    不要只选择 IPHostEntry.AddressList 中的第一个 IP 地址,而是在数组中搜索 IPv4 地址。请参阅this MSDN page 上的示例。

    【讨论】:

    • 我将定义 ipAddr 变量的行更改为 Dim ipAddr As IPAddress = System.Net.IPAddress.Parse("127.0.0.1") 并且似乎工作但打开了一个 TCP 端口,我需要一个 UDP港口。 :(
    • 即使使用SocketType.DgramProtocolType.UDP?
    • 谢谢!,我进行了更改并且似乎可以工作,直到我调用 Listen 方法并引发错误,因为 Listen 方法不适用于 UDP。我在互联网上阅读了一些内容,似乎将套接字置于 UDP 侦听模式的过程与 TCP 不同,我基于 TCP 服务器制作此代码。现在我正在尝试使用 BeginAccept 方法,但在 CallBack 上会引发错误,因为 EndAccept 方法不返回 asyncResult。
    • 对不起,我的意思是我尝试了 BeginAccept 但不起作用,现在我正在尝试 BeginConnect。我在这篇文章中添加回调代码
    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2017-06-04
    • 2017-09-23
    • 2013-10-13
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多