Používání recvfrom () s syrové zásuvek: stín pochybnosti

hlasů
2

Vytvořil jsem syrové objímku, která bere všechny pakety IPv4 z linkové vrstvy (s hlavičkou datové spojení vrstvy odstraněn). A pro čtení paketů používám recvfrom.

Mé pochybnosti je: Předpokládejme, že kvůli nějaké plánování hotový OS můj postup byl spící po dobu 1 sec. Když se probudil, to dělalo recvfrom(u které mají být přijaty počet bytů říci 1000) na tomto surovém zásuvky (s úmyslem přijímat pouze jednu IPv4 paket a říkají, že velikost paketu je 380 bajtů). A předpokládám, že mnoho síťových aplikací byly také běží současně během tohoto času, takže všechny pakety IPv4 musí být zařazeny do přijímací vyrovnávací paměti této zásuvky. Takže teď recvfromse vrátí všechny 1000 bajtů (s ostatními IPv4 paketů z 381th bajt dále) bcoz má dostatek dat do vyrovnávací paměti pro návrat. I když můj program měl chápat pouze jednu IPv4 paket

Tak jak se vyhnout tomuto věc? Měl jsem četl byte byte a analyzovat každý bajt, ale je to velmi neefektivní.

Položena 25/11/2009 v 11:01
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

IIRC, recvfrom()vrátí pouze jeden paket najednou, i když existuje více ve frontě.

Odpovězeno 25/11/2009 v 11:25
zdroj uživatelem

hlasů
1

Raw socket pracují na vrstvě paketů, není tam žádný koncept datových toků.

Možná vás bude zajímat recvmmsg(), pokud si chcete přečíst více paketů jednoho systémového volání. Pouze novější Linux jádra, není tam žádný ekvivalent implementace send strana.

Odpovězeno 18/08/2010 v 10:45
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more