gpt4 book ai didi

sockets - 是成功的 send() "atomic"吗?

转载 作者:可可西里 更新时间:2023-11-01 02:32:26 25 4
gpt4 key购买 nike

成功调用 send() 并且返回的数字等于 size 参数中指定的数量是否保证不会发生“部分发送”?

或者有什么方法可以让操作系统在为系统调用提供服务时中断,发送部分数据,等待可能很长时间,然后发送其余部分并返回而不通知我较小的返回值?

我不是在谈论内核缓冲区中没有足够空间的情况;我意识到我会得到一个较小的返回值并且必须重试。

更新:根据目前的答案,我的问题可以改写如下:

在调用 send() 返回之前是否有任何方法可以通过线路发送数据包/数据?

最佳答案

Does a successful call to send() with the number returned equal to the amount specified in >the size parameter guarantee that no "partial sends" will occur?

不,有可能您的部分数据通过网络传输,而另一部分仅被复制到本地 TCP 堆栈的内部缓冲区中。 send() 将返回编号。传递到本地 TCP 堆栈的字节数,而不是编号。传递到线路上的字节数(即使数据到达线路,也可能无法到达对等方)。

Or is there some way that the OS might be interrupted while servicing the system call, send part of the data, wait for a possibly long time, then send the rest and return without notifying me with a smaller return value?

因为 send() 只返回编号。传递到本地 TCP 堆栈的字节数,而不是 send() 是否实际发送任何东西,无论如何你无法真正区分这两种情况。但是,是的,可能只有一些数据通过网络传输。即使本地缓冲区中有足够的空间,对等方也可能没有足够的空间。如果您发送 2 个字节,但对等方只有 1 个字节的空间,则可能会发送 1 个字节,另一个将驻留在本地 tcp 堆栈中,直到对等方再次有足够的空间。

(这是一个极端的例子,大多数 TCP 堆栈都会防止一次发送如此小的数据段,但如果您尝试发送 4k 的数据但对等方只有 3k 的空间,这同样适用。

I'm not talking about a case where there is not enough room in the kernel buffer; I realize that I would then get a smaller return value and have to try again

只有当您的套接字是非阻塞的时才会发生这种情况。如果它正在阻塞并且本地缓冲区已满,send() 将等待直到本地缓冲区中再次有空间(或者,它可能会返回如果部分数据已交付,但同时发生错误,则进行简短计数。)

编辑回答:

Is there any way for packets/data to be sent over the wire before the call to send() returns?

是的。发生这种情况的原因有很多。例如

  • 本地缓冲区被最近的 send() 调用填满,并且您使用了阻塞 I/O。
  • TCP 堆栈通过线路发送您的数据,但决定安排其他进程以在发送进程从 send() 返回之前运行。

关于sockets - 是成功的 send() "atomic"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8041171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com