2012-04-09 45 views
0

UDP數據包大小我知道,閱讀,你可以發出此係統調用內核之前找出UDP數據包的大小:知道有投票選擇或epoll的

ioctl(s,FIONREAD,&num_bytes); 

但是,我可以找出相同與以下系統調用之一?

poll() 
select() 
epoll() 

關鍵是在讀取數據報之前知道數據報的大小,爲緩衝區分配空間。 這僅是爲Linux,在C.

+2

我很確定'recvfrom'有一個'MSG_PEEK'標誌,你可以用它來查詢包中的字節數(並且預覽它的內容而不從它中刪除它隊列),這將比醜陋的'ioctl'解決方案更便於攜帶... :-) – 2012-04-09 16:55:59

+0

最大UDP數據報大小爲64K,但是您是否曾經獲得大於1472字節的UDP消息?那是什麼協議? – 2012-04-09 18:12:21

+0

@R。謝謝R,好的提示。我在尋找的是保存在系統調用上,如果提到的3個系統調用中的一些可以給我可用數據包的大小(除了通知我在描述符上有數據可供讀取),這對速度會很有幫助(因爲當應用程序正在等待輸入時,我必須使用上述3中的一個) – Nulik 2012-04-09 18:19:25

回答

0

複用系統調用等pollselect期待一組條件來觀看(如輸入可用於FD#5,輸出有可能在FD#7),並告訴你哪些文件描述符是可讀的(哪些是可寫的等)。一旦你知道哪個文件描述符可以被讀取,你就可以在你可讀的文件描述符fd上使用ioctl(fd, FIONREAD, &numbytes)。所以你應該同時使用poll然後FIONREAD ...

+0

我相當肯定,使用UDP,您可以期望通過單個'read'或'recv'調用來接收單個數據包,因爲您的緩衝區足夠大。 (顯然這對TCP來說不是這樣) – 2012-04-09 16:37:13

+0

這是正確的。套接字接口將只返回完整的數據包,而不是片段。 – Perry 2012-04-09 16:40:47

+0

我以爲允許路由器對UDP數據包進行分片..我刪除了最後一句.. – 2012-04-09 16:43:30

相關問題