2010-03-18 4 views
3

Voici un scénario avec des sockets asynchrones que je ne comprends pas tout à fait ... J'ai 2 sockets Tcp, une socket client & une socket serveur. Mon socket serveur est lié & en écoute sur un port.C# Socket.BeginSend AsyncCallback comportement (timeout?)

Mes sockets client se connectent au socket serveur (en utilisant BeginConnect/EndConnect). J'envoie ensuite un message au serveur en utilisant BeginSend(). Du côté serveur, je ne fais pas de Receive() ou BeginReceive().

Ce qui se passe est que mon AsyncCallback spécifié pour mon appel BeginSend s'invoqué & son IAsyncResult me ​​dit qu'il a terminé & l'appel à Socket.EndSend() ne soulève pas d'exception ...

Y at-il quelque chose qui Je ne reçois pas ou ne devrait pas mon AsyncCallback être appelé seulement si l'appel de BeginSend envoie réellement quelque chose au serveur (ie: rappel appelé après que le serveur ait reçu tous les octets)? Si aucune réception n'a été effectuée sur le serveur, mon rappel ne devrait-il pas être appelé après l'expiration de sendtimeout et mon appel à Socket.EndSend déclencherait alors une exception?

Merci

Répondre

3

Non, TCP/IP gère tout cela pour vous. Il y a des tampons des deux côtés de la connexion qui retiendront les données jusqu'à ce qu'elles puissent être reçues. Sans la mise en mémoire tampon, il y aurait probablement une latence horrible lors de l'envoi de communications bavardes.

Pensez-y comme l'envoi d'une lettre. Il se trouve dans votre boîte aux lettres jusqu'à ce que le préposé au courrier le récupère. Une fois que cela arrive, il a été envoyé. Il n'a pas encore été reçu. Il pourrait être en transit, ou il pourrait être en attente dans leur boîte aux lettres pour les lire.

Donc obtenir le rappel après BeginSend vous indique seulement qu'il a été envoyé. La seule façon de savoir avec certitude que l'autre partie a reçu et traité les données est de demander un délai de reconnaissance.

+0

Attendez quoi? Le rappel beginends est appelé avant de recevoir le TCP ACK du serveur? Je ne suis pas sûr que j'aime ça. – Chris