UDP數據包大小我知道,閱讀,你可以發出此係統調用內核之前找出UDP數據包的大小:知道有投票選擇或epoll的
ioctl(s,FIONREAD,&num_bytes);
但是,我可以找出相同與以下系統調用之一?
poll()
select()
epoll()
關鍵是在讀取數據報之前知道數據報的大小,爲緩衝區分配空間。 這僅是爲Linux,在C.
UDP數據包大小我知道,閱讀,你可以發出此係統調用內核之前找出UDP數據包的大小:知道有投票選擇或epoll的
ioctl(s,FIONREAD,&num_bytes);
但是,我可以找出相同與以下系統調用之一?
poll()
select()
epoll()
關鍵是在讀取數據報之前知道數據報的大小,爲緩衝區分配空間。 這僅是爲Linux,在C.
複用系統調用等poll
或select
期待一組條件來觀看(如輸入可用於FD#5,輸出有可能在FD#7),並告訴你哪些文件描述符是可讀的(哪些是可寫的等)。一旦你知道哪個文件描述符可以被讀取,你就可以在你可讀的文件描述符fd
上使用ioctl(fd, FIONREAD, &numbytes)
。所以你應該同時使用poll
然後FIONREAD
...
我相當肯定,使用UDP,您可以期望通過單個'read'或'recv'調用來接收單個數據包,因爲您的緩衝區足夠大。 (顯然這對TCP來說不是這樣) – 2012-04-09 16:37:13
這是正確的。套接字接口將只返回完整的數據包,而不是片段。 – Perry 2012-04-09 16:40:47
我以爲允許路由器對UDP數據包進行分片..我刪除了最後一句.. – 2012-04-09 16:43:30
我很確定'recvfrom'有一個'MSG_PEEK'標誌,你可以用它來查詢包中的字節數(並且預覽它的內容而不從它中刪除它隊列),這將比醜陋的'ioctl'解決方案更便於攜帶... :-) – 2012-04-09 16:55:59
最大UDP數據報大小爲64K,但是您是否曾經獲得大於1472字節的UDP消息?那是什麼協議? – 2012-04-09 18:12:21
@R。謝謝R,好的提示。我在尋找的是保存在系統調用上,如果提到的3個系統調用中的一些可以給我可用數據包的大小(除了通知我在描述符上有數據可供讀取),這對速度會很有幫助(因爲當應用程序正在等待輸入時,我必須使用上述3中的一個) – Nulik 2012-04-09 18:19:25