[C] Comportamento recvfrom()

di il
7 risposte

[C] Comportamento recvfrom()

Salve a tutti!

Cerco di implementare una piccola applicazione client/server (servendomi del protocollo UDP) che al momento faccio girare in locale.

Secondo me tutto in teoria dovrebbe funzionare ma nella pratica.... per venirne a capo avrei una domanda da fare:

supponiamo che il client riceva un pacchetto attraverso la recvfrom(). Questa scriverà i dati nella locazione di memoria indicata ma...se dovesse arrivare un'altro pacchetto mentre il client è impegnato in questa scrittura, cosa accade? Si perde?

Il motivo di questa domanda è che, da quello che ho capito, ciò che accade sl mio codice è di ricevere il primo pacchetto, poi ne perde un pel pò, poi ne riceve correttamente un pò, poi ne perde ancora e continua così.
Tutto ciò non accade se rallento il server (ad esempio introducendo una sleep(1)) dopo ogni invio.

Scusate i termini estremamente generici della questione ma, visto che si tratta di "esperimenti" più che altro per capire il funzionamento delle cose non mi sembrava il caso di postare del codice che sembra non avere nessuno scopo

7 Risposte

  • Re: [C] Comportamento recvfrom()

    Solitamente bisogna temporizzare la spedizione dei pacchetti anche perchè il processore lavorerebbe solo su quel processo. Un sistema VOIP per esempio invia ogni 10/20 ms.
    Un'altra considerazione è che l'ordinamento e l'esito sulla ricezione è a tuo carico. Il socket è bloccante? Sistema Operativo?

    Saluti,
    Max
  • Re: [C] Comportamento recvfrom()

    Grazie Max!

    Dunque, il socket è bloccante e il sistema è Linux (Ubuntu).

    Quindi in un'applicazione "vera" l'invio è ritardato sul serio!
  • Re: [C] Comportamento recvfrom()

    Un'altra cosa che mi chiedo è questa:

    ho letto che la dimensione teorica di un pacchetto UDP è di 65507 byte ma che in pratica potrebbe non essere così...io sto scrivendo la mia applicazione facendo leggere nel server da un file blocchi di quella dimensione che poi spedisce...sbaglio?
  • Re: [C] Comportamento recvfrom()

    K,chiedo scusa ma non avevo notato la doppia risposta.

    Dunque, UDP e 65507... forse per via degli headers vari considerando le segmentazioni...
    ma sono sicuro di aver visto in giro pacchetti più grandi. Forse bzflag (il gioco dei carri armati)
    utilizza pacchetti + grossi... comunque non vorrei dire una c@#!&ta.

    Io di solito verifico le performance con multipli di 1K lordo.

    L'unica mia sperimentazione DATAGRAM -mai ufficializzata- l'ho fatta sperimentando un RTP (Real Time Protocol) solo in broadcast sulla mia rete... mia moglie mi disse che si sentiva 100 volte meglio di skype... per questo l'ho sposata!

    Saluti,
    Max
  • Re: [C] Comportamento recvfrom()

    Grazie ancora Max!

    Solo non ho capito bene ciò che intendevi dire con:
    Io di solito verifico le performance con multipli di 1K lordo.
    Intendi che nel codice fai una sorta di test per deteminare la dimensione che in protocollo sottostante supporta e poi usi quella?

    Scusa forse la banalità delle mie domande ma, come dicevo, non è per nulla il mio campo!

    P.s. colgo l'occasione per fare i miei auguri di buon 2011 a te e a tutti qui del forum!!!
  • Re: [C] Comportamento recvfrom()

    E si, ma non solo! Il primo è la dimensione del pacchetto ed il secondo la temporizzazione.

    Tutto questo se stai facendo sperimentazioni altrimenti è consigliato seguire le specifiche RFC

    Buon Anno anche a te e tutto il forum

    Saluti,
    Max
  • Re: [C] Comportamento recvfrom()

    Si si, i miei sono esperimenti...ma i dubbi crescono

    Diciamo che il server abbia deciso che dimensione e temporizzazione usare...dovrebbe chiedere anche al client se questi parametri vanno bene giusto (in particolare la dimensione visto che potrebbe essere su una rete differente)?
Devi accedere o registrarti per scrivere nel forum
7 risposte