VB   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了vb.net – UDP SocketException – 通常只允许使用每个套接字地址大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
尽管这里有许多非常相似的问题,所提供的答案都没有帮助我,这让我很难过:(

我有一个非常大的管理系统,我一直负责编写一些UDP数据包发送/接收.我已经写了一个原型,一切都很好,所以我开始将我的代码合并到所述系统中.但是,我现在有一个(不显示停止但很恼人)SocketException弹出:

System.Net.Sockets.SocketException occurred
  ErrorCode=10048
  message=Only one usage of each socket address (protocol/network address/port) is normally permitted
  NativeErrorCode=10048
  source=System
  StackTrace:
       at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot,SocketAddress socketAddress)
       at System.Net.Sockets.Socket.bind(EndPoint localEp)
       at System.Net.SocketS.UdpClient..ctor(Int32 port,AddressFamily family)
       at System.Net.SocketS.UdpClient..ctor(Int32 port)
       at Goose.Job.DeviceServerUDPReceiver.InitialiseReceiverClient() in C:\WORK\Trunk\Gooseorders\Classes\SheetCounter\DeviceServerUDPReceiver.vb:line 39

这是UDPReceiver类 – 它负责只是坐在一个循环中,等待来自我们已经点缀该地方的设备服务器的响应.

Public Class DeviceServerUDPReceiver : Implements IDisposable
'///////////////////////////////////////////////////////////////////////////////
' CONSTANTS
'///////////////////////////////////////////////////////////////////////////////
Private Const TIBBO_DEVICE_REPLY_CMD_START As Integer = 0
Private Const TIBBO_DEVICE_REPLY_CMD_END As Integer = 3
Private Const TIBBO_messaGE_REPLY_DIVIDER As String = "_"
Private Const TIBBO_DEVICE_REPLY_OK As String = "OK"

'///////////////////////////////////////////////////////////////////////////////
' MEMBER VARIABLES
'///////////////////////////////////////////////////////////////////////////////
Public _ReceivingClient As System.Net.SocketS.UdpClient
Public _iReceivingPort As Integer = 2002
Public _thReceivingThread As System.Threading.Thread
Public _bClosing As Boolean

'///////////////////////////////////////////////////////////////////////////////
' EVENTS
'///////////////////////////////////////////////////////////////////////////////
Public Event GotDeviceResponse(ByVal sResponse As String)
Public Event FoundNewDevice(ByVal TibboObject As TibboDevicE)

'///////////////////////////////////////////////////////////////////////////////
' METHODS
'///////////////////////////////////////////////////////////////////////////////
' Initialises the UDP receiver client on the specified port number. Then runs
' a listening thread constantly waiTing to receive udp messages
Public Sub InitialiseReceiverClient()
    Try
        ' TODO - FIX SOCKET EXCEPTION HERE - NOT THREAD ISSUE - THIS IS DUE TO 
        ' THE SOCKET NOT BEING CLOSED. BUT SEEING HOW UDP IS CONNECTIONLESS .... ?!
        _ReceivingClient = New System.Net.SocketS.UdpClient(_iReceivingPort)
        Dim thStartThread As Threading.ThreadStart = New Threading.ThreadStart(AddressOf SitAndReceivE)
        _thReceivingThread = New Threading.Thread(thStartThread)
        _thReceivingThread.IsBACkground = True
        _thReceivingThread.Start()
    Catch ex As System.Net.Sockets.SocketException
        Console.WriteLine("Socket Exception: " & ex.messagE)
    Finally

    End Try
End Sub

' The endless loop listener thread. Will sit and wait for udp packets to 
' process
Private Sub SitAndReceive()
    Dim epEndPoint as System.Net.IPEndPoint = New System.Net.IPEndPoint(System.Net.Ipaddress.Any,_iReceivingPort)

    ' infinite loop to listen for udp messages
    While (_bClosing = falsE)
        Try
            Dim smessage As String = ""
            Dim byData() As Byte

            byData = _ReceivingClient.Receive(epEndPoint)
            smessage = System.Text.Encoding.ASCII.GetString(byData)
            Console.WriteLine(smessagE)

            ProcessIncomingUDPDAtamessage(smessagE)

        Catch ex As System.Net.Sockets.SocketException
            Console.WriteLine(ex.messagE)
        End Try
    End While
End Sub

' close the connection to the receiving udp socket
Public Sub Close()
    _bClosing = True
End Sub


' Processes incoming udp packets for ANSWEREs from the device servers
Private Sub ProcessIncomingUDPDAtamessage(ByVal smessage As String)

    ' UDP Data packet from Tibbo devices is set out as follows
    '
    ' CMD_ANSWER
    ' Where "CMD" = The command the device is replying too and
    ' "ANSWER" = It's reply
    SELEct Case smessage.SubString(TIBBO_DEVICE_REPLY_CMD_START,TIBBO_DEVICE_REPLY_CMD_END)
        Case TibboDevice.DEVICE_COMMAND_ATO
            '/////////////////////////////////////////////////////////////////////////
            ' Any Tibbo's out there reply message 
            '/////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim smacAddress As String = s(2) ' the replying devices' mac address
            Dim sIpaddress As System.Net.Ipaddress = System.Net.Ipaddress.Parse(s(3)) ' ip
            Dim sNetBiosName As String = s(1) ' netbios name
            Dim iTibboStatus As TibboDevice.ETIIBO_DEVICE_STATE = TibboDevice.ETIIBO_DEVICE_STATE.TIBBO_DEVICE_STATE_BAD ' status

            ' set this device status depending on the reply
            If s(4) = TIBBO_DEVICE_REPLY_OK Then
                iTibboStatus = TibboDevice.ETIIBO_DEVICE_STATE.TIBBO_DEVICE_STATE_OK
            End If

            ' create a new tibbo device to pass BACk to the main form
            Dim Tibbo As TibboDevice = New TibboDevice(smacAddress,sIpaddress,sNetBiosName,iTibboStatus)
            ' raise event to add this to our list
            RaiseEvent FoundNewDevice(Tibbo)


        Case TibboDevice.DEVICE_COMMAND_STS
            '//////////////////////////////////////////////////////////////////////////
            ' Status reply message
            '//////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim sResult As String = ""

            ' format our String nicely
            sResult &= "Mac Address: " & vbTab & vbTab & s(1)
            sResult &= Environment.NewLine & "IP Address: " & vbTab & vbTab & s(2)
            sResult &= Environment.NewLine & "Device Name: " & vbTab & vbTab & s(3)
            sResult &= Environment.NewLine & "TiOS FW: " & vbTab & vbTab & s(4)
            sResult &= Environment.NewLine & "Goose SC FW: " & vbTab & vbTab & s(5)
            sResult &= Environment.NewLine & "System Uptime: " & vbTab & vbTab & s(6)
            sResult &= Environment.NewLine & "System Time: " & vbTab & vbTab & s(7)
            sResult &= Environment.NewLine & "System Status: " & vbTab & vbTab & s(8)

            RaiseEvent GotDeviceResponse(sResult)

        Case TibboDevice.DEVICE_COMMAND_ASC
            '////////////////////////////////////////////////////////////////////////////
            ' Average sheet count message
            '////////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim sResult As String = ""

            RaiseEvent GotDeviceResponse(sResult)

        Case TibboDevice.DEVICE_COMMAND_NAM
            '////////////////////////////////////////////////////////////////////////////
            ' Changed device name reply message
            ' Device will reply NAM_[NEWNAME] - once it's set it's new name
            '////////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim sResult As String = ""

            RaiseEvent GotDeviceResponse(sResult)

        Case TibboDevice.DEVICE_COMMAND_IDX
            '////////////////////////////////////////////////////////////////////////////
            ' Device responds with it's device id
            '////////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim sResult As String = ""

            ' TODO - do something with the result

        Case TibboDevice.DEVICE_COMMAND_RBT
            '////////////////////////////////////////////////////////////////////////////
            ' Device is going down for a reboot - not much to do here,we have to wait
            '////////////////////////////////////////////////////////////////////////////

        Case TibboDevice.DEVICE_COMMAND_BUZ
            '////////////////////////////////////////////////////////////////////////////
            ' Device has played it's buzz sound - ignore
            '////////////////////////////////////////////////////////////////////////////

        Case TibboDevice.DEVICE_COMMAND_FSH
            '////////////////////////////////////////////////////////////////////////////
            ' Device flashed it's LEDs - ignore
            '////////////////////////////////////////////////////////////////////////////

        Case TibboDevice.DEVICE_COMMAND_AIP
            '////////////////////////////////////////////////////////////////////////////
            ' Device replies with it's actual ip address
            '////////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim sResult As String = ""

            ' TODO - do something with the result

        Case TibboDevice.DEVICE_COMMAND_CBC
            '////////////////////////////////////////////////////////////////////////////
            ' Device replies with it's current box count
            '////////////////////////////////////////////////////////////////////////////
            Dim s() As String = smessage.Split(TIBBO_messaGE_REPLY_DIVIDER)
            Dim sResult As String = ""

            ' TODO - do something with the result

        Case TibboDevice.DEVICE_COMMAND_STP
            '////////////////////////////////////////////////////////////////////////////
            ' Device has been stopped - won't reply. Only way to bring it BACk to life
            ' is to press the 'reset' button on the actual unit - ignore
            '////////////////////////////////////////////////////////////////////////////
    End SELEct

End Sub

Protected Overridable Overloads Sub Dispose(disposing As Boolean)
    If (disposing) Then
        ' free managed objects
        '_ReceivingClient = Nothing
        _bClosing = True
    End If
End Sub

Public Overloads Sub Dispose() Implements IDisposable.Dispose
    Dispose(true)
    GC.SuppressFinalize(ME)
End Sub


End Class

现在,我在主窗体中所做的就是:当我的监听器窗体关闭时 – 我想关闭监听器(显然)……为此,我正在使用Dispose().但是,当有人想要再次启动它时,SitAndReceive过程中的byData = _ReceivingClient.Receive(epEndPoint)会发生异常.

由于UDP是基于事务的,并且它的套接字(理论上可能)不能处于CLOSE_WAIT状态,是什么阻止我关闭它然后立即重新启动监听器?

我必须承认我是UDP套接字的新手,但到目前为止,我发现它们很愉快,即使这个异常不会导致最终用户软件崩溃(使用简单的try / catch),它确实让我好奇,我想了解为什么会这样.

很感谢任何形式的帮助.

管理最终解决这个问题.显然,如果要与套接字建立多个连接,则必须手动配置它,如下所示:
Dim endPoint = New System.Net.IPEndPoint(0,_iReceivingPort)
_ReceivingClient = New System.Net.SocketS.UdpClient()
_ReceivingClient.ExclusiveAddressUse = false
_ReceivingClient.Client.SetSocketOption(Net.Sockets.SocketOptionLevel.Socket,Net.Sockets.SocketOptionName.ReuseAddress,TruE)
 _ReceivingClient.Client.bind(endPoint)

现在工作,所以我很高兴.

大佬总结

以上是大佬教程为你收集整理的vb.net – UDP SocketException – 通常只允许使用每个套接字地址全部内容,希望文章能够帮你解决vb.net – UDP SocketException – 通常只允许使用每个套接字地址所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。