Когда send () возвращается в программировании сокетов, что это значит? - PullRequest
3 голосов
/ 28 сентября 2010

когда send () возвращается, есть три возможности:

1.отправляемые данные были скопированы в буфер ядра

2.данные для отправки были отправлены на равноправный

3.отправляемые данные были отправлены одноранговому узлу и получили его подтверждение

Будучи действительно сбитым с толку, я прочел несколько фрагментов кода о стеке TCP / IP в источнике Linux и нашел путь к потоку данных.:

когда мы используем функцию send (), она вызывает основную функцию sys_sendto (), а функция sys_sendto () использует send_msg () для выполнения работы, тогда как send_msg () превращается в __send_msg () и, наконец, __send_msg () вызывает scm_send (), которая снова использует свою базовую функцию __scm_send ().

В целом поток данных работает по следующему пути:

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

В функции __scm_send () Копирует данные в буфер ядра.

, поэтому кажется, что первое предположение доказано, это правильно, или, может быть, я пропустил некоторые подробности или неправильно понял?

1 Ответ

4 голосов
/ 28 сентября 2010

В общем, все, что он гарантирует, это то, что данные были скопированы в буфер ядра. Ядро может или не может немедленно начать передачу. Действительно, в некоторых случаях из-за оконного TCP-соединения может быть невозможна немедленная передача.

Конечно, возможно, что сразу после копирования в буфер ядра может произойти переключение контекста, и к тому времени, когда ваш процесс снова запустится, пакет может быть получен узлом - но это очень маловероятно .

...