WSAEnumNetworkEvents, FD_WRITE et sockets asynchrones
WSAEnumNetworkEvents, FD_WRITE et sockets asynchrones - API Win32 - Programmation
MarshPosté le 06-06-2008 à 09:31:34
Coucou les amis.
Je suis en train de bricoler un serveur multiclients sans utiliser de threads. Je me sers donc de WSAEnumNetworkEvents() et de WSAWaitForMultipleEvents() pour multiplexer mes sockets (non bloquantes).
Quand mon serveur reçoit des données d'une socket, il traite la requête puis prépare le buffer qui va être renvoyé. A ce moment là je dois checker si je peux écrire sur ma socket puis envoyer la purée jusqu'à avoir vider mon buffer.
Malheureusement FD_WRITE ne se comporte pas comme je veux. Je souhaite que WSAEnumNetworkEvents() retourne avec WSAWaitForMultipleEvents() renvoyant l'event FD_WRITE tant que je peux écrire sur ma socket (comme select()). Comme cela je rajoute l'event FD_WRITE sur ma socket uniquement quand elle à un buffer à envoyer. Hors il semblerait (d'après la MSDN) que FD_WRITE ne retourne que lors ce que un send() précédent à retourné une erreur "buffer plein" (WSAEWOULDBLOCK) et que ce buffer redevient disponible.
Bref, il s'ouvre deux chemins... - Soit je reprends tout mon code pour utiliser select() à la place mais ca me semble moins adapté et surtout, j'ai un paquet de lignes de code a modifier - Soit je trouve une solution en gardant l'API actuelle, mais là je ne trouve pas de solution. Il me faudrait pouvoir réarmer l'event FD_WRITE après chaque send() (un truc du genre WSASetEvent(myEvent, FD_WRITE); ).
Marsh Posté le 06-06-2008 à 09:31:34
Coucou les amis.
Je suis en train de bricoler un serveur multiclients sans utiliser de threads.
Je me sers donc de WSAEnumNetworkEvents() et de WSAWaitForMultipleEvents() pour multiplexer mes sockets (non bloquantes).
Quand mon serveur reçoit des données d'une socket, il traite la requête puis prépare le buffer qui va être renvoyé. A ce moment là je dois checker si je peux écrire sur ma socket puis envoyer la purée jusqu'à avoir vider mon buffer.
Malheureusement FD_WRITE ne se comporte pas comme je veux. Je souhaite que WSAEnumNetworkEvents() retourne avec WSAWaitForMultipleEvents() renvoyant l'event FD_WRITE tant que je peux écrire sur ma socket (comme select()). Comme cela je rajoute l'event FD_WRITE sur ma socket uniquement quand elle à un buffer à envoyer.
Hors il semblerait (d'après la MSDN) que FD_WRITE ne retourne que lors ce que un send() précédent à retourné une erreur "buffer plein" (WSAEWOULDBLOCK) et que ce buffer redevient disponible.
Bref, il s'ouvre deux chemins...
- Soit je reprends tout mon code pour utiliser select() à la place mais ca me semble moins adapté et surtout, j'ai un paquet de lignes de code a modifier
- Soit je trouve une solution en gardant l'API actuelle, mais là je ne trouve pas de solution. Il me faudrait pouvoir réarmer l'event FD_WRITE après chaque send() (un truc du genre WSASetEvent(myEvent, FD_WRITE); ).
Toutes vos idées sont les bienvenues.