Pergunta

Existe alguma escalável de API do Win32 (como IOCP não gosta de escolha) que dá a você um reator de estilo operações em soquetes?AFAIK IOCP permite que você receba uma notificação sobre operações concluídas como dados de leitura ou escrita (proactor), mas eu estou olhando para o reator de estilo de operações:Eu precisa receber uma notificação quando o socket é legível ou de escrita (reator).

Algo semelhante para epoll, kqueue, /dev/poll ?

É lá essas API do Win32?Se sim, onde posso encontrar um manual sobre ele?

** Esclarecimento:** eu preciso select como api para soquetes que é tão escalável como o IOCP, ou eu estou procurando uma forma de usar o IOCP em reator de operações semelhantes.

Mais esclarecimentos: IOCP permite que você receba uma notificação sobre a realização de determinada operação.Por exemplo:

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

Assim que eu receber a noticação depois de a operação é feita -- proctor estilo das operações.

O que eu preciso é de algo como isso:

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

Como posso fazer isso?

Foi útil?

Solução 3

Não é possível.

Eu verifiquei o Impulso.Asio fontes que têm reator de operações de estilo e uso IOCP.Para todos os reator de operações de estilo thread separada com select é usado em vez de IOCP.

Outras dicas

Você quer olhar para o WSAAsyncSelect API.Ele usa uma fila de mensagem do Windows para sinalizar que um identificador é de leitura para leitura/gravação/seja o que for, então ele não tem a simultaneidade benefícios de IOCP, mas ele permite que você para implementar um padrão de reator padrão sem ter um limite para o número de identificadores (como WSAWaitForMultipleEvents).

Estou confuso, não Reator padrão, onde a thread bloqueia, esperando em várias fontes de evento?Que seria select(), que o windows oferece suporte.O Proactor padrão é onde existe um único retorno de chamada por chamada, que você pode fazer através de ReadFileEx/WriteFileEx.

Você já tentou passar de zero nNumberOfBytesToRead, por exemplo ReadFile(socket_fd, ..)?

Talvez isso vai ajudar a obter a "leitura" pronto para o evento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top