Jak se zbavit příchozích paketů v surovém zásuvky?

hlasů
3

Píšu / C ++ aplikace v C pod Linuxem, který čte data ze syrového zásuvky (pro ICMP pakety). Otázka: Existuje způsob, jak se zbavit všech dat, která je stále ve frontě na zásuvky?

Problém je v tom, že poté, co spí na chvíli, že jsou data ve frontě na patici které nemám zájem; tak to by bylo nejlepší jen říct zásuvku „Zapomeňte na všechny údaje, které jste nastřádané právě teď“, takže když jdu do select () / recvfrom () smyčky a pak jsem jen získat data, která byla v nedávné době obdržel.

Existuje lepší způsob, než první jít do samostatného hlasování) / recvfrom) smyčky ((? Některé socket API volání možná? Přenosný, i? :-)

Položena 16/10/2008 v 17:23
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
1

Jediný způsob, jak vím, jak na to spolehlivě, je zavřít zásuvku.

Odpovězeno 16/10/2008 v 18:00
zdroj uživatelem

hlasů
0

Nezkoušel jsem to, a to by mohlo být zcela nerozumné z důvodů výkonu (ale pokud vaše aplikace spí stejně, mohlo by to neměl být problém), ale: můžete zkusit nastavení zdířky je vyrovnávací paměť pro příjem do určité velmi malé hodnoty před spánkem. Doufám, že to způsobí, že zásuvka, že nebude moci vyrovnávací paměti data, která přichází, když je aplikace neposlouchal. Je to docela dlouhý záběr.

Nebo snad resetovat přijímat velikost vyrovnávací paměti po spánku, když jste připraveni začít znovu čtení, způsobí, že se to spláchnout stejně. Samozřejmě, že tyto druhy triků, jsou právě to, a to iv případě, že pracují, jsou s největší pravděpodobností není přenosná. Jen jsem myslel, že se shodnou na tom, pokud máte šanci ji testování by to mohlo pomoci.

Odpovězeno 17/10/2008 v 14:45
zdroj uživatelem

hlasů
0

Můžete udělat něco takového, těsně předtím, než budete spát?

for(n=0;n<=MAX_BUFFER_SIZE;n++)
{
recv_buffer[n] = 0;
}
Odpovězeno 20/10/2008 v 22:09
zdroj uživatelem

hlasů
1

Prostě nemůžete udělat recvfrom()do dočasné vyrovnávací paměti a odstraňte vyrovnávací paměti?

Odpovězeno 20/10/2008 v 22:14
zdroj uživatelem

hlasů
5

Během doby nečinnosti, můžete zakázat socket nastavením Receive velikost vyrovnávací paměti na nulu:

 int optval = 0; /* May need to be 1 on some platforms */

 setsockopt(sockDesc, SOL_SOCKET, SO_RCVBUF, (char *)(&optval), sizeof(optval));

Znovu povolit nastavením „optval“ na větší vyrovnávací paměti (např 4096).

Odpovězeno 21/10/2008 v 13:41
zdroj uživatelem

hlasů
2

Doporučil bych nespal vůbec. Insted pomocí select volání zpracovávat data ihned, když to přijde.

while (1)
{

    FD_ZERO (&sockets);
    FD_SET (raw_socket, &sockets);

    timeout.tv_sec = 1;
    timeout.tv_usec = 0;

    if (select (raw_socket + 1, &sockets, NULL, NULL, &timeout))
    {
    if (FD_ISSET (raw_socket, &sockets))
    {
        // handle the packet
    }
    }
    else
    {
    /* Select Timed Out */
    fprintf(stderr, "Timed out");
    }
}  

Také při vytváření váš syrové zásuvku jste mohli určit, že vás zajímá pouze v ICMP pakety.

Odpovězeno 23/10/2008 v 09:00
zdroj uživatelem

hlasů
0

Standardní postup v middleware aplikací je mít vyhrazené vlákno obslouží požadavky IO s prioritou nastavena na vyšší než u ostatních aplikačních vláken. Když se IO vlákno přijme paket je to enqueues na aplikační vrstvě. Když se aplikace má volný čas dequeues další paket.

Jedná se o architekturu za TIBCO Rendezvous se používá v mnoha dat v reálném čase na trhu a systémů zasílání zpráv organizace. Námitka je obecně chcete nějaké omezení na velikost fronty, takže aplikace nedostane sklízeli správcem OOM. Protokol mezi závitem IO a aplikační vrstvy se může lišit od jednoduchého asynchronní fronty na složitější filtrování předmět, seznamech prioritních a podporu pro závitové bazény pro dekódování příchozích dat paralelně.

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

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