Domanda

La rete lib sto scrivendo necessità di inviare e ricevere messaggi tramite un socket TCP. I messaggi possono essere inviati o ricevuti in qualsiasi momento, cioè dovrebbe funzionare come un canale full duplex.

Sono stato in grado di attuare tale scenario utilizzando due fili. Thread principale chiamata send () e un filo dedicato prevalentemente bloccato a recv () call

La mia domanda è: è possibile implementare lo stesso scenario con un singolo thread? Cioè registrando una certa funzione di callback?

Come nota a margine:. Ho bisogno di implementare questo scenario in C ++, Java e Python

È stato utile?

Soluzione

Si, è possibile. È necessario utilizzare un'API che permette multiplex di I / O. In C / C ++ e Python è possibile utilizzare select () e non-blocking I / O, in modo che la chiamata rete di soli sei mai blocco è select (). C'è anche poll () e epoll () e una serie di altre API simili che ottenere la stessa cosa, con vari gradi di efficienza e portabilità. Java è non-blocking I / O API anche.

Un'altra possibilità è quella di utilizzare I / O asincrono, dove dite il sistema operativo per avviare un'operazione di I / O e avvisa (con qualche meccanismo) quando ha finito l'operazione. Io non sono a conoscenza che lo stile di programmazione di rete, però, quindi non cercherò di dare i dettagli.

Altri suggerimenti

In generale, una biblioteca farebbe questo fornendo un'interfaccia in loop / loop principale evento dell'applicazione.

Per esempio, applicazioni di rete utilizzando più thread singolo avrebbe un ciclo principale che blocca in select(), poll() o simile. La vostra biblioteca sarebbe solo restituire un descrittore di file che l'applicazione dovrebbe includere nel suo invito select() / poll(), e una funzione di callback che l'applicazione deve chiamare quando quel descrittore di file è leggibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top