我在VB.NET中完成了一个应用程序,该应用程序侦听特定的UDP端口,并通过相同的端口回复发送数据包的IP。 它从几年到上个月都运行良好;现在当尝试通过套接字错误10013来应对崩溃时。
我甚至尝试使用旧版本,我知道它也在运行并且同样崩溃。
我尝试禁用Microsoft Security Essentials实时保护和Windows防火墙,但没有工作。
在代码中我有一行
MyUdpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True)
我不知道该怎么做,我迷失了。
知道如何解决这个问题吗?
修改 这是代码
#Region "UDP Send variables"
Dim GLOIP As IPAddress
Dim GLOINTPORT As Integer
Dim bytCommand As Byte() = New Byte() {}
#End Region
Dim MyUdpClient As New UdpClient()
Private Sub StartUdpBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartUdpBtn.Click
If StartUdpBtn.Tag = 0 Then
' If Not UdpOpen Then
StartUdpReceiveThread(CInt(ListeningPortLbl.Text))
'End If
Else
If ThreadReceive.IsAlive Then
ThreadReceive.Abort()
MyUdpClient.Close()
PrintLog("UDP port closed")
StartUdpBtn.Tag = 0
UdpOpen = False
StartUdpBtn.Text = "Start UDP"
End If
End If
If UdpOpen Then
StartUdpBtn.Tag = 1
StartUdpBtn.Text = "Stop UDP"
Else
StartUdpBtn.Tag = 0
StartUdpBtn.Text = "Start UDP"
TimerUDP.Enabled = False
TiempoUDP.Stop()
TiempoUdpLbl.Text = "--:--:--"
End If
End Sub
Private Sub StartUdpReceiveThread(ByVal Port As Integer)
Dim UdpAlreadyOpen As Boolean = False
Try
If Not UdpOpen Then
MyUdpClient = New UdpClient(Port)
MyUdpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True)
UdpAlreadyOpen = True
Else
Me.Invoke(Sub()
TiempoUDP.Restart()
If TimerUDP.Enabled = False Then
TimerUDP.Enabled = True
End If
End Sub)
End If
ThreadReceive = New System.Threading.Thread(AddressOf UdpReceive)
ThreadReceive.IsBackground = True
ThreadReceive.Start()
UdpOpen = True
If UdpAlreadyOpen Then
PrintLog(String.Format("UDP port {0} opened, waiting data...", Port.ToString))
End If
Catch ex As Exception
PrintErrorLog(ex.Message)
PrintErrorLog(ex.StackTrace)
End Try
End Sub
Private Sub UdpReceive()
Dim receiveBytes As [Byte]() = MyUdpClient.Receive(RemoteIpEndPoint)
DstPort = RemoteIpEndPoint.Port
IpRemota(RemoteIpEndPoint.Address.ToString)
Dim BitDet As BitArray
BitDet = New BitArray(receiveBytes)
Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
If UdpOpen Then
StartUdpReceiveThread(CInt(ListeningPortLbl.Text))
End If
PrintLog("From: " & RemoteIpLbl.Text & ":" & ListeningPortLbl.Text & " - " & strReturnData)
AnswersProcessor(strReturnData)
End Sub
Private Sub UdpSend(ByVal txtMessage As String)
Dim pRet As Integer
GLOIP = IPAddress.Parse(RemoteIpLbl.Text)
'From UDP_Server3_StackOv
Using UdpSender As New System.Net.Sockets.UdpClient()
Dim RemoteEndPoint = New System.Net.IPEndPoint(0, My.Settings.UDP_Port)
UdpSender.ExclusiveAddressUse = False
UdpSender.Client.SetSocketOption(Net.Sockets.SocketOptionLevel.Socket, Net.Sockets.SocketOptionName.ReuseAddress, True)
UdpSender.Client.Bind(RemoteEndPoint)
UdpSender.Connect(GLOIP, DstPort)
bytCommand = Encoding.ASCII.GetBytes(txtMessage)
pRet = UdpSender.Send(bytCommand, bytCommand.Length)
End Using
PrintLog("No of bytes send " & pRet)
End Sub
答案 0 :(得分:2)
10013是WSAEACCES
,documented如下:
许可被拒绝。
尝试以其访问权限禁止的方式访问套接字。一个例子是使用sendto的广播地址而没有使用setsockopt(SO_BROADCAST)设置广播权限。
WSAEACCES错误的另一个可能原因是,当调用bind函数时(在带有SP4及更高版本的Windows NT 4.0上),另一个应用程序,服务或内核模式驱动程序绑定到具有独占访问权限的同一地址。这种独占访问是带有SP4及更高版本的Windows NT 4.0的新功能,并通过使用SO_EXCLUSIVEADDRUSE选项实现。
答案 1 :(得分:1)
在你提到的评论中:
我在XP x32上尝试了该程序并且工作正常,但在Windows 7 x32 / x64上没有,即使我禁用了防火墙和Microsoft Security Essentials Live Protection。
听起来似乎很明显,但您可以尝试在所有可用的 Windows XP兼容模式中启动程序。你没有说你已经尝试过这个但也许你很幸运,这个问题将通过这种解决方法“解决”。
如果问题仍然存在,并考虑到错误代码10013,我会尝试或检查以下事项:
就像验证错误是否只发生在您的UDP套接字上的一点测试:尝试使用TCP套接字而不是UDP。
在Windows 安全模式下启动网络支持并从那里执行您的程序。
在另一台Windows 7计算机上运行程序,看看是否出现同样的问题。这可能是一个有价值的起点(在本地化方面),以了解问题是否仅出现在特定版本的Windows上。
使用调试器单步执行代码并仔细观察会发生什么。也许这可以揭示一些关于出了什么问题的额外信息。
也许上面的一些想法可以帮助您更多地追踪问题。祝你好运!