我有一個考慮udp數據包生命/路由的問題。我有一個簡單的客戶端服務器UDP方案,在客戶端發送呼叫,在服務器端接收呼叫。假設發送方法被調用,並且數據包實際到達另一側,但服務器的代碼執行尚未到達接收方法調用。在那個時候,數據包會發生什麼?現在,我嘗試在收到呼叫之前用一個簡單的命令輸入提示來停止執行,等待一會兒,然後讓它繼續並注意到該數據包已收到。你能解釋一下爲什麼會發生這種情況,就像它在不同的OSI級別上緩衝一樣?Java中的UDP數據包路由
在此先感謝。
我有一個考慮udp數據包生命/路由的問題。我有一個簡單的客戶端服務器UDP方案,在客戶端發送呼叫,在服務器端接收呼叫。假設發送方法被調用,並且數據包實際到達另一側,但服務器的代碼執行尚未到達接收方法調用。在那個時候,數據包會發生什麼?現在,我嘗試在收到呼叫之前用一個簡單的命令輸入提示來停止執行,等待一會兒,然後讓它繼續並注意到該數據包已收到。你能解釋一下爲什麼會發生這種情況,就像它在不同的OSI級別上緩衝一樣?Java中的UDP數據包路由
在此先感謝。
每個TCP或UDP套接字都有一個發送緩衝區和一個接收緩衝區。你的數據報在發送方排入發送緩衝區,然後發送,然後它在接收方排入接收緩衝區,然後從那裏讀取。
「receive」方法調用不接收數據包。如果該端口有一個「打開」的UDP套接字,則表示分配了緩衝區空間,這就是NIC + OS放置數據的位置。當你打電話給「接收」時,它只是看起來那裏,如果有什麼,那麼它假裝剛剛收到它。
我應該補充一點,如果緩衝區爲空,那麼接收調用會進入阻塞狀態,等待操作系統通知某事已到達。
這是假設他已經設置了'DatagramSocket'(即'DatagramSocket server = new DatagramSocket(port)',我想他已經有了這種情況下應該有一個接收緩衝區,正如你所說的 – Jared
@Jared明顯地。如果他沒有創建套接字,那麼數據就不會在任何地方排隊,問題就不存在了。回想一下你自己有點猜測的答案,UDP會從NIC獲得一箇中斷,將數據拉出來,看到它是對於不存在的端口,將其丟棄,然後發出ICMP錯誤消息。 – EJP
我刪除了我的答案,這顯然是錯誤的。 – Jared