2010-09-28 11 views
3

lors d'envoi() retourne, il y a trois possibilités:Lorsque send() retourne dans la programmation de socket, qu'est-ce que cela signifie?

1. les données à envoyer a été copié dans le tampon du noyau

2. les données à envoyer a été envoyé par les pairs

3. les données à envoyer a été envoyé par les pairs et a reçu son ack

Être vraiment confus, je lis quelques morceaux de code sur le protocole TCP/IP lorsque nous utilisons la fonction send(), elle appelle la fonction sys_sendto() sous-jacente, et la fonction sys_sendto() utilise send_msg() pour effectuer le travail, tandis que send_msg() devient __send_msg() et enfin __send_msg() invoque scm_send() qui utilise à nouveau sa fonction sous-jacente __scm_send().

Dans l'ensemble, le flux de données exécute dans ce chemin:

send() ==> sys_sendto() ==> send_msg() ==> __send_msg() ==> scm_send() ==> __scm_send()

En fonction __scm_send(), Il copie les données à la mémoire tampon du noyau.

donc il semble que la première hypothèse est prouvée, est-ce exact, ou peut-être que j'ai raté un détail ou un malentendu?

Répondre

4

En général, tout ce qu'il garantit est que les données ont été copiées dans le tampon du noyau. Le noyau peut ou non commencer immédiatement la transmission. En effet, dans certains cas, en raison de la fenêtre TCP, il peut ne pas être possible de transmettre immédiatement. Bien sûr, il est possible que, immédiatement après la copie dans le tampon du noyau, un changement de contexte se produise, et au moment où votre processus recommence à fonctionner, le paquet peut avoir été reçu par le pair - mais c'est très improbable.