2013-04-18 12 views
1

有沒有辦法,我可以從傳入的數據包中獲取sockaddr信息,而無需事先對數據進行recvfrom?我只是想知道,因爲你可以說有些東西需要像民意調查或選擇一樣閱讀,我想知道在實際閱讀發送的數據之前是否可以從中獲得更多信息。我問這是因爲我有一個系統,其中每個單獨的IP /端口組合都有自己的內部緩衝區,我們把分塊的消息放進去,我需要知道這樣才能將它放入正確的內部緩衝區。在讀取udp之前找到sockaddr信息

回答

1

是的,通過向recvfrom調用提供MSG_PEEK標誌。

recvfrom(socket, buffer, 1, MSG_PEEK, &address, &address_len); 

這樣會使數據報完好無損並且不會將其刪除。您當然可以爲緩衝區大小指定一個較小的值,以減少不必要的讀取開銷。下一次你做一個正常的recvfrom數據報將被正常刪除。

recvfrom(socket, buffer, length, 0, &address, &address_len); // Do the actual read 
+0

如果我有來自多個來源的數據包等待接收它們將保持秩序?換句話說,如果我查看並獲取sockaddr信息,我保證下一次調用recvfrom以實際獲取信息將是相同的來源?如果沒有,無論如何強制手動recv從特定的sockaddr? – csteifel

+1

是的。數據包將保持順序。所有標誌都允許您檢查數據報,而不將其從隊列中刪除或重新排序。 –