2016-07-11 117 views
0

有沒有辦法通過UDP偵聽器偵聽UDP數據包,然後將數據轉換爲字符串或任何其他數據並通過TCP套接字發送到TCP服務器,我不是非常熟悉UDP,所以任何提示將是偉大的偵聽UDP套接字並轉發到TCP套接字(可能是Java的)

+0

藉此 [UDP連接的例子]看看(https://systembash.com/a-simple-java-udp-服務器和UDP的客戶端/) –

回答

-2

我不會擔心UDP到TCP我會擔心其他方式。

您無法通過UDP接收到您無法放入緩衝區的內容,因此所有接收都會轉換爲一個或多個TCP發送。

另一方面,TCP是基於段的協議,您可能只接收已確認且可用於應用程序緩衝區的重組部分的部分,在所有情況下,這可能不是整個應用程序層消息,因爲我會說明。

讓數據= 30,000字節的數據...

在機器的某個地方得到這個數據,你可以只傳遞一個指針,但得到它,你必須使用網絡或硬件應用是另一臺機器通常通過驅動程序訪問。

套接字是一種常見的設計模式或更簡潔的界面,允許很大的不同網絡和媒介來傳達不均勻...

通過套接字,你可以簡單地擔心協議,如IP或TCP或UDP也許ICMP而且您不必擔心數據如何到達硬件。

網絡堆棧通常是操作系統的一個組件,它與硬件和軟件驅動程序進行交互操作,並且隱藏在Socket接口後面,這樣當只有協議是硬件和網絡時,硬件和網絡的語義無關緊要關注...

返回數據...

發送將被分割爲可以適應網絡媒體上的幾個包中的數據,這通常被稱爲最大可發射單元。

它允許介質所需的標題字段以及足夠的數據量以允許流量控制驅動程序。

驅動程序接收到此數據並創建網絡數據包,這些數據包可以在中等和本地計算機網絡上輕鬆發送和接收。

爲了到達物理網絡,必須將附加層添加到數據包中,例如IP和協議標頭,在這種情況下爲TCP。

網絡堆棧讓我們的驅動程序知道數據已準備好在發送呼叫期間發送。

的數據被複制到網絡棧和應用程序可以繼續進行(TCP或UDP)

分段由下TCP最大段大小或更小的協議創建和將它們發送。

當收到任何一個段並確認可以通過調用recv來接收。

數據的順序由網絡堆棧維護,如果沒有收到整個段,它將被重新發送。如果某個細分受衆羣的一部分被收到,則該細分受到保護,直到其之前的細分受衆羣得到確認。

TCP的某些實現允許將部分接收的段提供給應用程序緩衝區(使用特殊配置或其他方式,通常禁用tcp重傳以及發送和接收合併但不限於),即使丟失或碎片已接收期間段的一部分內發生,通常是該段的其餘部分將在下一次收到時收到,並提供給應用程序但它是完全可能有更多的數據,從一個新的報文段到達和舊的數據要麼從來不或到達太遲,以至於您的應用程序無法接收已經發布到應用程序的數據。

因此,您通常會在接收端最終接收30,000字節(實際上由於IP和TCP開銷,實際上會多一點),但在某些情況下,您可能會按順序接收數據或根本不接收數據,可能是由於您和接收器之間的路由硬件故障造成的,當然不是標準,但它確實可能發生。

在這種情況下應用層應該能夠確定何時這種異常發生時或者通過使用應用協議內的序列號或通過掃描其可以以各種方式來實現IP和TCP報頭。

希望這是足以讓你想......也請參閱When sending data larger than the SendBufferSize, how will the data be received?

+0

他沒有說,這樣做的另一種方式圓東西。答案完全脫離主題,並且大部分都是華夫餅乾。 – EJP

+0

謝謝,也許你會在你的下一個「出版物」中引用它。煎餅,sufley不管事實是事實愛德蒙詹姆斯,他們不...要麼指出什麼是錯的或者......你知道在這裏[原文]插入什麼 – Jay

+0

而且順便說一句,我寫這個答案專爲您和與您和您的legandary TCP徽章spefically接收下來表決的inention ......有趣的事情是如何工作了... – Jay