【问题标题】:When send() returns in socket programming, what does that mean?当 send() 在 socket 编程中返回时,这是什么意思?
【发布时间】:2011-04-18 02:46:31
【问题描述】:

send() 返回时,有三种可能:

1.要发送的数据已复制到内核缓冲区

2。要发送的数据已发送到对等体

3.要发送的数据已发送到对等方并收到其确认

真的很迷茫,看了一些Linux源码中关于TCP/IP栈的代码,找到了数据流的路径:

当我们使用 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() 函数中,它将数据复制到内核的缓冲区中。

所以第一个假设似乎得到了证明,是正确的,还是我错过了一些细节或误解?

【问题讨论】:

    标签: sockets network-programming tcp send


    【解决方案1】:

    一般来说,它只保证数据已被复制到内核缓冲区。内核可能会或可能不会立即启动传输。事实上,在某些情况下,由于 TCP 窗口化,可能无法立即传输。

    当然,在复制到内核缓冲区之后,可能会立即发生上下文切换,并且当您的进程再次运行时,数据包可能已被对等方接收 - 但这不太可能.

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 2012-04-20
      • 2014-10-31
      • 2018-06-09
      相关资源
      最近更新 更多