C/C++ stav cache v socketoch

Sekcia: Programovanie 30.07.2007 | 15:30
Avatar zerxen Fedora,Debian, Slackware  Používateľ
Jazyk C obaleny do C++ :
Snazim sa nakodit nieco pouzivajuc TCP a UDP sockety. vsetko mi fakci... len mam problem ze vsetky beginner tutorialy spomenuly len samotnu pracu so socketmi ako "send" , "recv" , "bind" atd .. atd ...

Moj problem/starost je v tom ze neviem ziskat informacie ohladom velkosti { maximalnej a vytazenej } cache priestoru pre data ktore boli prijate socketom a este si ich funkcia recv "nevyzdvihla".

Ako toto info zistim? Aplikacia je eazy hra ktora momentalne "doslova" spamuje socket aktualizaciami pozicii hraca a ja by som v ramci oprimalizacie komunikacie rad vedel monitorovat "zahltenie" socketu.

Este aby som priblizil, momentalne mam server-like aplikaciu pre par klientov a pre kazdeho klienta sa spawne dedicated vlakno ktore caka na data { recv blokuje ak nie su ziadne data } a potom ich aj spracovava ze ich posiela do spolocneho FIFO zasobnika kde si ich prebera hlavna logika softu. Ale problem je to ze ak raz nastane situacia ze danemu vlaknu sa budu hromadit data a nebude ich stihat davat do zasobnika{ napr koli MUTEXom pri zasobniku }, ja o tom ani len nebudem vediet!! :(

mozno som pozeral zle ale v header suboroch odkial mam sockety som nic nenasiel :(

Btw, ak si tiez myslite ze moja schema pre komunikaciu je naprosto sprosta tak mi mozte dat napad na inu ;-) serverovu stranu aplikacie robim prvy-krat.
First they ignore you.. Then they laught at you... Then they fight you... Then you win. Ghandi
    • Re: C/C++ stav cache v socketoch 30.07.2007 | 15:45
      Avatar Misko Kripel slackware  Používateľ
      >> recv blokuje ak nie su ziadne data

      inak to vies ze sa to da spravit aj tak ze recv nic neblokuje?
      do fdset das filedescriptor socketu a selectom to potom pravidelne kontrolujes, ak nastala zmena (prisli data) tak spravis recv. Kedze tam data su tak sa ti to nezablokuje
      asdf
      • Re: C/C++ stav cache v socketoch 30.07.2007 | 16:57
        Avatar zerxen Fedora,Debian, Slackware  Používateľ
        void TcpSocket::set_non_blocking ( const bool b )
        {
        // m_sock - socket discriptor
        int opts;

        opts = fcntl ( m_sock,
        F_GETFL );

        if ( opts < 0 )
        {
        return;
        }

        if ( b )
        opts = ( opts | O_NONBLOCK );
        else
        opts = ( opts & ~O_NONBLOCK );

        fcntl ( m_sock, F_SETFL ,opts );

        }

        Ten non blocking poznam ale co myslis tym :
        >> a selectom to potom pravidelne kontrolujes
        ??? co je select ? Lebo ked som si robil "hello non-blocking socket" tak som to chceckoval len tak ze recv dalo navratovu hodnotu int -1 ak nenaslo data alebo 0 ak sa spojenie prerusilo.
        ci "select" je nieco ine? Ak ano tak pls mozes rozviest?
        First they ignore you.. Then they laught at you... Then they fight you... Then you win. Ghandi
        • Re: C/C++ stav cache v socketoch 31.07.2007 | 17:09
          Avatar Misko Kripel slackware  Používateľ
          • Re: C/C++ stav cache v socketoch 31.07.2007 | 20:40
            Avatar zerxen Fedora,Debian, Slackware  Používateľ
            Thx za link ..

            Mno, je to sice tiez sposob, ale oba selecty "cakaju" a periodicky reaguju ... coz by bolo sice lahsie nakodit ale myslim ze sa aj tak vyberiem systemom 1 vlakno = 1 blocking recv = 1 klient .. bude to sice tazie nakodit, ale orcite mi to pride efektivnejsie ako naberat milisekundy na casoch odozvy koli periodickemu "ignorovaniu" dat v sockete. .. ale asi si spravim alternativ triedu ktora to skusi takto .. uvidim co da lepsie vysledky pri roznom zatazeni a pocte klientov.
            First they ignore you.. Then they laught at you... Then they fight you... Then you win. Ghandi
    • Re: C/C++ stav cache v socketoch 18.08.2007 | 14:39
      Avatar lacodomin RedHat,Fedora  Používateľ
      skus pouzit getsockopt() SO_RCVBUF co ti poskytne velkost buffra , nie momentalne zaplnenie .
      • Re: C/C++ stav cache v socketoch 18.08.2007 | 14:45
        Avatar lacodomin RedHat,Fedora  Používateľ
        este pohlad z druhej strany : ak posles data a na druhej strane je full buffer potom errno bude EWOULDBLOCK

        retc = send(sd,buff,send_length,0);
        if (retc == -1 && errno == EWOULDBLOCK)

        EAGAIN or EWOULDBLOCK
        The socket is marked non-blocking and the requested operation would block.