Domanda

C'è qualche API Win32 scalabile (come IOCP non come selezionare) che fornisce lo stile del reattore operazioni sui socket? Per quanto ne so IOCP consente di ricevere notifiche su operazioni completate come i dati letti o scritti (proactor), ma sto cercando stile reattore di operazioni: I necessario per ottenere la notifica quando il socket è leggibile o scrivibile (reattore).

Qualcosa di simile a epoll, kqueue, /dev/poll?

C'è ad esempio API Win32? Se è così, dove posso trovare un manuale su di esso?

** Chiarimento: ** Ho bisogno select come API per socket che sia il più scalabile come IOCP, o sto cercando un modo per utilizzare IOCP nel reattore come operazioni

.

Ancora più precisazione: IOCP consente di ricevere una notifica al termine della data operazione. Ad esempio:

WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done

Così ho notication dopo operazione viene eseguita -. Stile Proctor delle operazioni

Che cosa ho bisogno è qualcosa di simile:

WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read

Come posso fare questo?

È stato utile?

Soluzione 3

Non è possibile.

Ho controllato le fonti Boost.Asio che hanno operazioni in stile reattore e utilizzano IOCP. Per tutte le operazioni di stile reattore thread separato con select si utilizza invece IOCP.

Altri suggerimenti

Si vuole guardare il WSAAsyncSelect API. Esso utilizza una coda di messaggi di Windows per segnalare che una maniglia viene letto per la lettura / scrittura / qualunque cosa, in modo che non ha i vantaggi di concorrenza di IOCP, ma consente di implementare un modello di reattore standard senza avere un limite al numero di maniglie (come WSAWaitForMultipleEvents).

Sono confuso, non è modello Reactor dove i blocchi di filettatura in attesa su più fonti di eventi? Sarebbe select (), che supporta Windows. Il modello Proactor è dove c'è una sola richiamata per chiamata, che si può fare tramite ReadFileEx / WriteFileEx.

Hai provato a passare a zero nNumberOfBytesToRead, ad esempio ReadFile (socket_fd, ..)?

Forse aiuterà a ottenere l'evento "letto pronto".

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