gpt4 book ai didi

python - socket.send() 和 socket.sendall() 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 22:12:10 47 4
gpt4 key购买 nike

我对 Python 中的 socket.send()socket.sendall() 函数感到困惑。据我了解the documentation send() 函数使用 TCP 协议(protocol),sendall() 函数使用 UDP 协议(protocol)发送数据。我知道 TCP 对于大多数 Web 应用程序来说更可靠,因为我们可以检查哪些数据包已发送,哪些数据包未发送。这就是为什么,我认为使用 send() 函数比 sendall() 函数更可靠。

此时,我想问一下,这两个函数的具体区别是什么,哪个对web应用更可靠?

谢谢。

最佳答案

socket.send 是一种低级方法,基本上只是 C/syscall 方法 send(3)/send(2) .它可以发送的字节数少于您请求的字节数,但会返回发送的字节数。

socket.sendall 是一种仅限 Python 的高级方法,用于发送您传递的整个缓冲区或引发异常。它通过调用 socket.send 来做到这一点,直到所有内容都已发送或发生错误。

如果您正在使用带有阻塞套接字的 TCP 并且不想被打扰通过内部(大多数简单的网络应用程序都是这种情况),使用 sendall。

还有 python 文档:

Unlike send(), this method continues to send data from string until either all data has been sent or an error occurs. None is returned on success. On error, an exception is raised, and there is no way to determine how much data, if any, was successfully sent

感谢 Philipp Hagemeister 对我过去的简要描述。

编辑

sendall 在后台使用 send - 看看 cpython执行。这是示例函数(或多或少),例如 sendall :

def sendall(sock, data, flags=0):
ret = sock.send(data, flags)
if ret > 0:
return sendall(sock, data[ret:], flags)
else:
return None

或来自 rpython (pypy source) :

def sendall(self, data, flags=0, signal_checker=None):
"""Send a data string to the socket. For the optional flags
argument, see the Unix manual. This calls send() repeatedly
until all data is sent. If an error occurs, it's impossible
to tell how much data has been sent."""
with rffi.scoped_nonmovingbuffer(data) as dataptr:
remaining = len(data)
p = dataptr
while remaining > 0:
try:
res = self.send_raw(p, remaining, flags)
p = rffi.ptradd(p, res)
remaining -= res
except CSocketError, e:
if e.errno != _c.EINTR:
raise
if signal_checker is not None:
signal_checker()

关于python - socket.send() 和 socket.sendall() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34252273/

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