2010-05-18 8 views
7

dati possono essere letti o scritti in un socket TCP collegato mediante ricezione(), async_receive(), invio() o funzioni membro async_send(). Tuttavia, poiché questi potrebbero provocare brevi scrive o legge, un'applicazione si utilizzano in genere le seguenti operazioni invece: read(), async_read(), write() e async_write().Le funzioni di ricezione/invio del socket di boost.asio sono sbagliate?

Non ho davvero capito che le note come read(), async_read(), write() e async_write() possono anche finire in brevi scritture o letture, giusto?
Perché queste funzioni non sono le stesse?
Devo usarli affatto?
Qualcuno può chiarire quell'osservazione per me?

risposta

6

Il lettura, async_read, scrittura e async_write sono composte funzioni che chiamano le funzioni di classe più volte finché viene trasmesso il numero richiesto di byte. Sono inclusi dalla biblioteca per comodità. Altrimenti, ogni sviluppatore dovrebbe implementare la stessa logica.

Le funzioni di classe racchiudono direttamente le funzioni del sistema operativo sottostante, che in pratica indicano nella documentazione: queste funzioni possono tornare prima che tutti i byte vengano trasmessi.

Nella maggior parte dei casi, è necessario utilizzare le funzioni gratuite (composte) per trasmettere i dati.

+0

Perché è stato progettato in questo modo? In tal caso non è necessario ricevere tutti i byte richiesti? Perché l'oggetto socket non include read/write/async_read/async_write? Comunque stai passando una presa. –

+0

Non so perché, ma è possibile trovare la risposta nella "Proposta di libreria di rete per TR2". http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2054.pdf – Dan

+1

Per quanto riguarda il documento precedentemente collegato, guarda a pagina 8. – Dan

-1

Prima di tutto, devi capire la parola "asincrono", significa semplicemente "non devi aspettare". Dopo l'invocazione di azioni asincrone, la seguente azione verrà eseguita senza attendere il ritorno di azione asincrona. Mentre sincrono è necessario attendere finché non vengono restituite le azioni sincrone precedenti. I due esempi seguenti da Boost.Asio avrebbe senso: A synchronous TCP daytime server

(! Ops non abbastanza reputazione, il secondo campione è facile da trovare, però, chiamato "Un server TCP daytime asincrona")

+0

Com'è collegato alla mia domanda? –

+0

scusa .... presumo che il primo paragrafo della tua domanda fosse una citazione ... quindi li ho inghiottiti ..... – rhapsodyn

Problemi correlati