2009-03-23 6 views
1

Est-ce que Socket.SendAsync enverra toujours toutes les données dans le tampon byte[] auquel le SocketAsyncEventArgs a été affecté? J'ai testé du code mais seulement sur un réseau local et là il semble être de cette façon ...Net SendAsync envoie toujours toutes les données?

Editer:
Ok mais envoie-t-il toujours toutes les données avant d'exécuter l'événement terminé?

le seul socket.BeginSend ne l'ont pas si je me souviens bien ..

Répondre

1

Il tentera d'envoyer toutes les données, mais, à partir de la documentation sur MSDN:

« Pour les sockets orientés messages, ne dépassent pas la taille maximale des messages du fournisseur de services Windows sous-jacent sockets Si les données. trop long pour passer atomiquement à travers le fournisseur de service sous-jacent, aucune donnée n'est transmise et la méthode SendAsync lève une exception SocketException avec l'ensemble SocketAsyncEventArgs.SocketError au code d'erreur Winsock WSAEMSGSIZE natif (10040). "

Il y a des moments où un tampon trop grand devrait être divisé. Cela dépend de l'implémentation du socket sous-jacent.

+0

Y at-il un moyen de détecter la taille de la mémoire tampon ou existe-t-il une taille sûre? – Peter

1

Non, ce ne sera pas. Il y a beaucoup de facteurs à considérer ici y compris la mise en mémoire tampon, les expirations, etc.

Le plus simple à considérer est la limite sur les paquets au niveau IPV4. Les paquets IPV4 ont une limite stricte qui ne peut pas être dépassée (65 535 octets). Il n'est donc pas possible pour SendAsync de pousser en un seul paquet des données plus grandes qu'une taille de paquet IPV4.

Questions connexes