Un socket non bloquant opération n'a pas pu être réalisées immédiatement sur envoyer
Je suis en train d'écrire un serveur pour un jeu, et je veux être capable de gérer des milliers d'utilisateurs simultanés. Pour cette raison, je suis allé avec les sockets non bloquant et l'utilisation de la méthode de sondage. Cependant, je dois créer plusieurs threads pour gérer la base de données et des appels web, et certains de ces fils va envoyer une réponse à l'utilisateur. Dans l'un de ces fils, sur envoyer, j'obtiens l'erreur "d'Un socket non bloquant opération n'a pas pu être réalisées immédiatement". Ce qui pourrait causer ce problème? J'imagine que c'est parce qu'un sondage est en cours en même temps que l'envoi est appelé. Si j'ai utilisé beginAsync, faudrait-il arrêter cette erreur? J'ai pensé sur le verrouillage de la douille, mais je ne veux pas que mon thread principal pour être bloqué pour ce.
OriginalL'auteur Nikhil | 2012-03-23
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas quel genre de non-blocage du scrutin prise des appels utilisez-vous, mais je vous recommande d'utiliser le Async prise d'appels (au lieu de le Commencer). Pour plus d'informations sur la différence entre appels Asynchrones vs Commencer voir: Quelle est la différence entre BeginConnect et ConnectAsync?
Les appels asynchrones faire automatiquement "interrogation" sur le niveau de l'OS, qui sera beaucoup plus efficace de votre bureau de vote. Comme une question de fait, ils utilisent IO ports d'achèvement, ce qui est probablement la manière la plus rapide et la plus efficace chose que vous pouvez utiliser sur Windows pour gérer un grand nombre de connexions client/demandes.
Aussi loin que l'erreur, je considère que c'est le fonctionnement normal de non-blocage des sockets, donc vous avez juste à le manipuler correctement.
Mise à jour
Votre serveur devrait probablement faire quelque chose comme ceci:
Exemple de Code de courtoisie de code du projet: http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class
ah, a obtenu, merci! Je voudrais encore vous recommandons que l'OP utilise IOCP au lieu d'essayer de faire de l'interrogation. Pas besoin de réinventer la roue, surtout depuis la
Socket
classe fournit déjà de l'IOCP avec Async* de la famille des appels.J'utilise connectasync pour le client silverlight. Avez-vous un exemple pour le serveur? Alors que je regarde dans connectasync, avez-vous des recommandations sur la manipulation gracieusement?
Je n'ai pas un exemple de mon propre, mais vous pouvez vérifier ce codeproject exemple. La manipulation "gracieusement" signifie souvent prendre la bonne action à continuer le bon fonctionnement de votre application. Je ne sais pas ce que la sécurité de fonctionnement de votre application ressemblerait, donc je ne peux pas vous dire quelle serait la gestion appropriée dans votre cas. Certaines personnes ignorer l'erreur, certains journaux, d'autres pop-up d'avertissement à l'utilisateur de voir... il existe de nombreuses façons d'aller à ce sujet.
Merci. Maintenant, je viens de mettre un try catch autour d'elle. L'utilisateur manque une mise à jour, mais si ils rafraîchir, qu'ils vont obtenir ce qu'ils sont censés. À Long terme, je vais jeter un oeil à ce que vous avez posté.
OriginalL'auteur Kiril
Lorsqu'un socket non bloquant essaie de lire les données mais n'en trouve aucun, vous obtenez l'erreur: la prise voudrais attendre pour les données, mais ne peut pas car il doit retourner immédiatement, non-blocage.
Je vous suggère de l'interrupteur de blocage des sockets, savoir pourquoi on manque de données, d'ajuster en conséquence revenir ensuite à des non-bloquantes. Ou, vous pouvez gérer l'erreur et recommencer l'opération.
OriginalL'auteur Alex
Je recevais également cette exception sur l'envoi de données et viens de trouver la solution.
Vous obtenez une exception, car le socket send buffer est plein. Parce que vous essayez d'envoyer des données par le biais d'un non-blocage de l'envoyer, l'exception est soulevée pour vous laisser savoir que vous DEVEZ l'envoyer par un blocage de l'envoyer.
Les données ne sont pas envoyées une fois que l'exception est levée, de sorte que vous avez à le renvoyer. Votre appel envoyer devient maintenant;
Il serait également une bonne idée d'augmenter le socket SendBufferSize. Par défaut, je pense qu'il est de 8 ko. Pour mes besoins, j'ai eu à l'augmenter de 2 MO, et ensuite l'Envoyer appel n'est plus jeté cette exception.
OriginalL'auteur whalebiologist
Cette exception est trop général. Par MSDN,
Sockets codes d'erreur sont ici.
OriginalL'auteur Sherlock