2009-11-25 63 views
2

我創建了一個原始套接字,它從數據鏈接層獲取所有IPv4數據包(數據鏈接層頭已被移除)。並且爲了讀取我使用的數據包recvfrom在原始套接字中使用recvfrom():一般疑問

我的疑問是: 假設由於某些調度由OS完成,我的過程睡了1秒。當它醒來時,它在這個原始套接字(其目的是接收只有一個 IPv4分組並且假定這個分組的大小是380字節)上做了recvfrom(接收字節數1000)。假設許多網絡應用程序在此期間也同時運行,所以所有IPv4數據包必須已在此套接字的接收緩衝區中排隊。因此,現在recvfrom將返回全部1000字節(從第381字節開始的其他IPv4數據包)bcoz它的緩衝區中有足夠的數據返回。雖然我的程序只是爲了理解只有一個IPv4數據包

那麼如何防止這件事呢?我應該逐字節讀取並解析每個字節,但效率非常低。

+0

你在使用什麼操作系統? – abyx 2009-11-25 10:22:42

+0

可以請你發佈你的代碼!!!! – 2011-01-27 12:22:39

回答

2

IIRC,recvfrom()將一次只返回一個數據包,即使隊列中有更多數據包。

1

原始套接字在包層操作,沒有數據流的概念。

如果您想在一次系統調用中讀取多個數據包,您可能會對recvmmsg()感興趣。最近的Linux內核只有,沒有相應的發送端實現。