2009-06-04 14 views
2

J'ai besoin de envoyer et recv en même temps.
Quelle option serait préférable:Non-blocage Socket Polling vs Blocage socket

  • 1 envoyer manipulation de fil & recv avec socket non bloquant

ou

  • 2 fils avec une manipulation de blocage recv() + une manipulation envoyer()?

Ou existe-t-il une autre solution? Je m'attends à avoir jusqu'à 50 connexions bidirectionnelles environ. Ce qui entraîne 50 thread dans l'option n ° 1, et 100 thread dans l'option n ° 2.

Répondre

0

Vous pouvez utiliser un thread avec deux sockets non bloquantes et utiliser select() pour attendre l'entrée et l'espace dans la file d'attente de sortie.

Ensuite, vous n'avez pas besoin d'interroger car select() bloque sans utiliser le temps processeur.

+0

sondage, ne sélectionnez pas! :-P (Ok, si vous utilisez WinSock, sélectionnez est probablement plus portable, mais vous pouvez également utiliser WSAWaitForMultipleEvents dans ce cas, qui est comme sondage. :-P) –

+1

C'était une réponse à la "Ou est-il un autre option?" partie de sa question. Et comme il n'a mentionné aucune plate-forme, j'avais choisi la version la plus portable qui soit select() [Disponible en C/C++, sous Windows/Linux, PERL et beaucoup, beaucoup d'autres langages!) – mmmmmmmm

2

Vous devez utiliser des sockets non bloquantes, mais plutôt que de les interroger manuellement, vous devriez faire en sorte que le noyau le fasse pour vous. Utilisez soit poll ou select pour cela (le premier est préféré, car il peut gérer plusieurs sockets en même temps). Quand vous faites ceci, vous finirez avec 1 fil dans l'option 1, ou 2 fils dans l'option 2. :-P

+0

interroge un standard C/C++ fonction? Impossible de le trouver .. Merci –

+0

Il s'agit apparemment d'une "extension d'interfaces système X/Open": http://www.opengroup.org/onlinepubs/009695399/functions/poll.html –

+0

Dans ce sens, select est probablement "plus standard": http://www.opengroup.org/onlinepubs/009695399/functions/select.html (Cependant, je supporte toujours l'utilisation de poll, pour les plateformes qui le supportent.) –

3

Je n'utiliserais aucune de ces approches.

Jetez un oeil à this SO question. J'utiliserais un modèle de threads de travail où N thread traiterait tout le trafic avec des sockets non bloquantes.

Si vous devez absolument suivre l'une des approches que vous venez de décrire, optez pour un système à mon humble avis non bloquant.

+0

+1 Bien que cette question ne soit pas une question Java, elle se prête vraiment très bien à l'utilisation d'Executors en Java, qui implémente à peu près le modèle que vous avez décrit dans votre article lié. –

+0

Oui. Les exécuteurs sont super. Absolument. –

0

Si vous êtes préoccupé par la performance et l'évolutivité, essayez IOCP (prise async lecture/écriture): How to write a scalable Tcp/Ip based server

Notez qu'il est beaucoup plus délicat à mettre en œuvre IOCP que « un fil par connexion », et puisque vous êtes ne va avoir que 50 connexions (ou 100 threads comme vous le suggérez), cela peut être «assez bon» et plus simple à mettre en œuvre correctement. Essayez l'approche simple et mesurez-la ... mais si vous: avez besoin de plus de performances, ou si vous allez évoluer (loin?) Au-delà de 50 connexions, considérez sérieusement IOCP comme une meilleure solution.