大佬教程收集整理的这篇文章主要介绍了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,请注明来意。