当 send() 在 socket 编程中返回时,这是啥意思?

Posted

技术标签:

【中文标题】当 send() 在 socket 编程中返回时,这是啥意思?【英文标题】: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() 函数中,它将数据复制到内核的缓冲区中。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于当 send() 在 socket 编程中返回时,这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Socket 的网络编程

socket文件异常后select返回值

socket.send 在 io.sockets.on() 之外

非阻塞方式socket send()返回大小和实际发送大小不一致

套接字:send() 函数返回“Broken Pipe”错误

Python网络编程之socket之send和recv原理剖析