2010-05-17 30 views
1

我有一個需要在同一端口上傳輸和接收的應用程序。這可能發生在兩種情況下:.net中的雙向/環回UDP

  • PC正在與一個遠程硬件進行通信的地方。它「回覆發件人」,所以數據報通過發送端口回到我的電腦。

  • PC正在自測(回送模式)進行測試和演示(測試應用程序通過UDP向我們的主應用程序提供假數據)的地方。

這似乎只在嘗試實現環回時失敗。唯一能讓它工作的方法是確保接收器是首先設置的 - 這是我無法保證的。

任何人都可以通過建議一個「正確」的方式來實現UdpClient(s)來可靠地處理上述情況,以幫助縮小我的搜索範圍嗎?我發現可以與遠程硬件一起可靠地工作的唯一解決方案是以雙向方式使用單個UdpClient,儘管我正在使用可能影響該發現的遺留代碼。使用兩個UdpClients,但他們踩在其他每個腳趾 - 在某些情況下,一旦一個客戶端啓動,另一個客戶端無法連接。設置ExclusiveAddressUse/ReuseAddress允許端口共享,我幾乎可以得到它的工作,除了具有接收器首先啓動)

編輯

要闡述:

我們通過UDP與外部硬件進行通信。當它收到我們的通訊時,它會回覆源地址 - 所以我們會收到同一端口上的消息。這部分工作正常。但是,如果我嘗試使用環回模擬外部硬件(即,通過「自己」發送和接收相同的端口),我只能接收數據報,如果我開始接收數據報之後纔開始傳輸。這工作正常 - 但如果我傳輸,然後嘗試接收,我從來沒有收到任何數據。在這種情況下,我實際發送的內容是無關緊要的。

所以,我有兩個問題:

1)如何管理環回功能,可靠地工作。

2)如何做(1)不破壞目前工作正常的外部通信!

由於我已經嘗試了1或2個UdpClients的各種組合以及多種不同的設置(無效),我只是想知道是否有人設法使UPD環回工作正常,因爲這可能會給我這導致了我可以在所有情況下都能工作的解決方案。

感謝您花時間思考這個問題...

+1

您能否澄清一下:硬件或測試應用程序是否向您的應用程序發送了UDP數據包,並將響應發回給您?或者你的應用程序發送數據包到硬件或測試應用程序,這些發送迴應?你可以編輯你的問題,並展示各方之間的典型數據交換? – 2010-05-20 11:45:21

+0

正如邁克斯科特所建議,請澄清更多,以便您可以得到確切的答案。 – 2010-05-24 11:34:18

回答

3

所以我想我理解你的問題。

您有

1-發送UDP數據到被在接收一個硬件設備的客戶端應用說端口1234,同時本應用也端口接收響應1234

2 - 在端口1234上接收UDP數據並在端口1234上響應發送端的硬件設備。

因此,當您在同一臺機器上使用硬件設備時,您最終會收到客戶端應用程序和硬件模擬器,在同一個IP地址127.0.0.1和端口1234上的UDP數據包?

我是否抓住了你所擁有的本質?

如果是這樣,是否考慮在機器中添加第二個IP地址?這樣做不是的意思是你需要有2個網卡,一個網卡可以有多個IP地址。這樣你就可以在一個單獨的界面上打開兩個「設備」,這個界面應該能夠克服在同一界面上的任何衝突。

例如,如果您有兩個IP地址192.168.0.5192.168.0.6

客戶端應用程序可以被髮送給192.168.0.6和接收上192.168.0.5 而硬件仿真器接收關於192.168.0.6並響應192.168.0.5

以下是描述如何添加其他IP地址的鏈接。
http://www.itsyourip.com/networking/how-to-add-multiple-ip-address-in-windows-2000xp2003/

這是2000/XP/2003,但該過程對於Vista和Windows 7

+0

謝謝克里斯。它開始看起來像我無法實現實際的回送,並且將不得不放在一個特殊情況下用於演示目的(所以演示可以由對UDP有最小技術知識的人來運行),並且實現運行測試客戶端在不同的IP上進行測試。 – 2010-05-24 18:23:16

+0

@Jason Williams,我認爲走這條路線會給你最可靠和一致的結果。 – 2010-05-25 16:41:50

5

這是設計。

與需要連接的TCP相比,UDP通信的連接更少。

當從UDP發送數據時,它被廣播。這意味着它只能用於在廣播時仍然活着的接收器。

例如:

TCP就像一個電話。呼叫者呼叫接收者。接收方接受呼叫併發生通信。如果接收方不可用,主叫方會收到一個錯誤(主叫方是客戶端,接收方是服務器在監聽端口)

UDP就像調頻廣播。不管有沒有人在另一端聽,都會用廣播播放一首歌。如果接收機已經把他們的收音機放在他們將會收到歌曲。如果歌曲在10:30發送,我的收音機在10:30發送,我可以聽到這首歌。但是如果我在10點35分把我的raido設置好,那麼這意味着我錯過了它,並且不能再聽到它。

更新

,我可以看到真正的問題是傳輸端口1111(例如)雖然應用X,並通過應用Y於同一臺機器接收端口1111是你想達到什麼目的。

對於相同的我可以建議2變通辦法(不好,但可行)。

  1. 正如你所說,如果你啓動接收器後啓動發射器一切都很好。所以試着定期重新設置發射機的邏輯。

  2. 每次發送和接收2個端口。例如。 1111和2222.遠程硬件將使用第一套1111,演示應用程序將使用2222.

+1

感謝您花時間回答,但這並不能解釋如何獲得回送工作。我不希望收到在我開始收聽之前發送的數據包,但我希望在收聽時收到(至少一些)發送的數據包。 – 2010-05-24 18:14:18

+0

爲更新而歡呼。在情況下(1)它沒有幫助。我必須完全釋放端口(tx和rx),然後才能按「正確」順序重新啓動並重新啓動它。情況(2)不是環回,所以不能解決問題。我已經接受了其他答案,因爲它提供了我可以找到的最接近的解決方法,以便讓回送工作。 – 2010-05-26 19:12:29

0

相似後很長一段時間,從這個代碼的時候,我有機會再看看它,併爲這個問題制定了令人尷尬的微不足道的解決方案。

事實證明,調用我的UDP類的客戶端代碼將它設置爲發送和接收。因此,我沒有帶寫入權限的發送器和帶讀取權限的接收器,而是實際上有一個帶讀/寫和讀/寫接收器的發送器。

這意味着如果發送器首先被初始化,它也會嘗試在該端口上接收,因此它會抓取所有發送的數據報。當接收機連接時,它從來沒有收到任何數據,只是因爲它正在被髮射機使用。