已经运行的应用程序现在获得套接字错误10013

时间:2016-09-14 13:41:56

标签: vb.net sockets

我在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

2 个答案:

答案 0 :(得分:2)

10013是WSAEACCESdocumented如下:

  

许可被拒绝。

     

尝试以其访问权限禁止的方式访问套接字。一个例子是使用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,我会尝试或检查以下事项:

  • 我知道你禁用了“Microsoft Security Essentials”和Windows防火墙,但仔细检查是否还有其他与安全相关的程序/服务,如防病毒保护,反恶意软件工具等。听起来有点阻止你的socket创建/绑定。
  • 如果您的程序创建了日志输出/数据,您可以在 开始失败时准确查看
    • 当时安装的任何新软件?
    • 当时是否安装了Windows更新(可能是自动安装)?特别是有关网络安全的安全更新?
    • 您的环境中有任何其他明显的变化吗? Windows系统日志中的日志条目怎么样?
  • 就像验证错误是否只发生在您的UDP套接字上的一点测试:尝试使用TCP套接字而不是UDP。

  • 在Windows 安全模式下启动网络支持并从那里执行您的程序。

  • 在另一台Windows 7计算机上运行程序,看看是否出现同样的问题。这可能是一个有价值的起点(在本地化方面),以了解问题是否仅出现在特定版本的Windows上。

  • 使用调试器单步执行代码并仔细观察会发生什么。也许这可以揭示一些关于出了什么问题的额外信息。

也许上面的一些想法可以帮助您更多地追踪问题。祝你好运!