2011-04-28 134 views
2

嘿,所有。我有一個與C#問題,它很可能可能是調試器,但我相當新的C#(不是新的C/C++)C#在新創建的套接字上丟棄UDP數據包

有下面的代碼。這是我遇到的問題。

我得到UDP,沒有保證傳遞,當然。我希望偶爾的數據包丟在網絡上,或者如果我把管道塞滿了,就用windows。但是,我遇到的問題是,在創建一個新的套接字後,我嘗試發送一個包含1個字節數據的數據包。這個數據包被丟棄。我可以嘗試併發送兩次,這兩次都會丟失。但是,如果我發送1k價值的數據,它就會通過。如果我創建另一個套接字(通過再次單擊該按鈕),一切工作正常。現在這是奇怪的事情。如果我停止並重新啓動調試項目而不對源進行任何更改,則我的所有數據包都會毫無問題地發送。它似乎只在項目建成後的第一次運行中發生。無論如何,這是重現問題的代碼。經過幾個小時的搜索和閱讀,我不知所措。 編輯:想澄清我正在使用wireshark並可以看到數據包被丟棄。

private void button1_Click(object sender, EventArgs e) 
    { 
     byte[] a = new byte[1] {0x00}; 
     byte[] b = new byte[1024]; 
     for(int i = 0; i < 1024; i++) 
     { 
      b[i] = 0xFF; 
     } 

     IPEndPoint _ipep = new IPEndPoint(IPAddress.Parse("192.168.200.202"),5546); 
     Socket _server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     _server.SendTo(a, 1, SocketFlags.None, _ipep); 
     _server.SendTo(a, 1, SocketFlags.None, _ipep); 
     _server.SendTo(b, 1024, SocketFlags.None, _ipep); 
    } 
+0

你能分享收到的代碼嗎? – 2011-04-28 20:44:29

+0

我沒有看到發佈接收代碼的相關性。它是用arm處理器寫在c上的。我可以用wireshark看到一切。 – Jason 2011-04-28 21:28:06

+0

我上面發佈的代碼將允許您在如此傾向的情況下重新創建問題。 – Jason 2011-04-28 21:53:58

回答

1

從您對ARP問題的評論,我想建議一些方法來調試和縮小問題,然後提出一些解決方案。

如何調試:

  1. 嘗試使ARP表項的 「靜態」 這樣 您的電腦不會每次發送ARP請求 。要使ARP條目爲靜態 ,您可以在命令 提示符處輸入「arp」,以查看選項列表 並幫助添加靜態ARP條目。

  2. 另一個想法是打開命令 提示並寫上「ping 192.168.200.202 -t」,以便您的PC持續ping另一個客戶端。 這將使您的PC的ARP條目 保持最新,當您運行您的C#程序 時,它不會再發送 ARP,並且它會直接發送 的UDP。

以上幾點只是爲了調試並確保您猜對了問題。

可能的解決方案:

  1. 如果它的ARP問題,那麼我幾乎可以肯定,它的問題與您的網絡交換機,那麼請嘗試更換你的「開關」(我認爲它的故障)。
  2. 如果有可能,那麼你可以考慮讓你的「ARP​​條目」靜態。對於所有情況,這可能不是一個好主意,完全取決於應用程序的性質是否允許採用這種方法。

我希望它有幫助。

+0

感謝您的提示。我的應用程序可以容忍使用靜態arp條目。在win7中,您需要使用netsh,因爲此功能已從「arp」中刪除。唯一不容錯的數據包是第一個數據包。我只是在兩次之間暫停一次。如果兩者都發送,這不是一個問題。但是,我發現有趣的是,第一個到目的地的數據包不在arp緩存中,很有可能被丟棄。猜測我對盡力而爲的定義有所不同。感謝您的提示。 – Jason 2011-05-04 04:28:53