2016-09-14 71 views
6

我在VB.NET中完成了一個應用程序,該應用程序偵聽特定的UDP端口,並通過相同的端口應答發送數據包的IP。 從幾年到上個月,它的工作狀況良好;現在當試圖回答崩潰,由於套接字錯誤10013.已經運行的應用程序現在獲取套接字錯誤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 
+1

請顯示您的實際代碼崩潰。如果之前的代碼工作正常,並且自從你沒有更改代碼,那麼問題必須是環境問題。 –

+0

@RemyLebeau我添加了代碼。 –

+0

根據@ RemyLebeau的回答,有可能某些其他應用程序已經在使用該端口。您可以嘗試從命令提示符下運行 'netstat -a'或從Microsoft下載TCPView。檢查運行在您嘗試使用的相同端口號上的內容。 –

回答

2

10013是WSAEACCES,這是documented如下:

權限被拒絕。

嘗試以訪問權限禁止的方式訪問套接字。一個示例是使用sendto的廣播地址,而不使用setsockopt(SO_BROADCAST)設置廣播權限。

WSAEACCES錯誤的另一個可能的原因是調用綁定函數時(在Windows NT 4.0 SP4和更高版本上),另一個應用程序,服務或內核模式驅動程序綁定到具有獨佔訪問權的相同地址。這種獨佔訪問是帶有SP4和更高版本的Windows NT 4.0的新功能,並且通過使用SO_EXCLUSIVEADDRUSE選項實現。

1

在評論你所提到的:

我試圖在XP X32程序和工作正常,但在Windows 7 X32/X64不這樣做,即使我禁用防火牆和Microsoft Security Essentials的實時保護。

也許這聽起來幾乎是顯而易見的,但你可以嘗試在所有可用的的Windows XP兼容模式的啓動程序。你沒有說你已經試過這個,但也許你很幸運,這個解決方法將解決問題。

如果問題仍然存在之後,考慮的10013錯誤代碼,我會嘗試或檢查下列事項:

  • 我知道你已禁用「微軟安全必備」和Windows防火牆,但雙檢查是否有其他與安全相關的程序/服務如反病毒保護,反惡意軟件工具等正在運行。這聽起來像是阻礙了你的套接字創建/綁定。
  • 如果你的程序創建日誌輸出/數據,讓你清楚地看到它開始失敗:
    • 安裝在那個時候任何新的軟件?
    • 當時是否安裝了Windows更新(可能會自動)?尤其是關於網絡安全的安全更新
    • 你的環境中有其他明顯的變化嗎?你的Windows系統日誌中的日誌條目怎麼樣?

  • 就像如果你的UDP套接字只出現該錯誤的小測試來驗證:嘗試使用TCP套接字而不是UDP。

  • 在Windows啓動機器安全模式與網絡支持並從那裏執行您的程序。

  • 在另一臺Windows 7計算機上運行您的程序,看看是否出現同樣的問題。這可能是一個有價值的起點(就本地化而言),以瞭解問題是否僅出現在特定版本的Windows上。

  • 用調試器單步執行代碼並仔細觀察發生了什麼。也許這可以揭示一些關於發生了什麼問題的額外信息。

也許上面的一些想法可以幫助您追蹤更多的問題。祝你好運!

+0

是的,我嘗試了XP SP2和SP3兼容模式,並且在兼容模式下也使用管理權限。我沒有任何其他工具,我嘗試在另外兩臺PC上獲得相同的結果。 LOG表示數據正在接收,但在嘗試回答遠程主機時崩潰;特別是當UdpSend子例程嘗試執行UdpSender.Client.Bind(RemoteEndPoint)行時。整個想法是等待來自遠程GPRS調制解調器的一些數據,並回答是否需要,並將命令發送到發送任何數據的最後一個遠程IP。遠程IP,因爲是GPRS,並不總是相同的。 –

相關問題