Python socket.send()和socket.sendall()之间有什么区别?

Python socket.send()和socket.sendall()之间有什么区别?,python,sockets,Python,Sockets,我对Python中的socket.send()和socket.sendall()函数感到困惑。我从send()中了解到,函数使用TCP协议,而sendall()函数使用UDP协议发送数据。我知道TCP对于大多数Web应用程序更可靠,因为我们可以检查哪些数据包被发送,哪些数据包没有发送。这就是为什么我认为使用send()函数比使用sendall()函数更可靠 在这一点上,我想问一下这两个函数之间的确切区别是什么,以及哪一个对于web应用程序更可靠 多谢各位 socket.send是一种低级方法,基

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

在这一点上,我想问一下这两个函数之间的确切区别是什么,以及哪一个对于web应用程序更可靠


多谢各位

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

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

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

和python文档:

与send()不同,此方法继续从字符串发送数据,直到 所有数据都已发送或发生错误。没有一个是返回的 成功。出现错误时,将引发异常,无法 确定成功发送的数据量(如果有)

感谢菲利普·哈格梅斯特对我过去的简短描述

编辑

sendall
在引擎盖下使用
send
-查看实施情况。下面是一个示例函数,其作用(或多或少)类似于
sendall

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


文档非常清楚,IMO-
.send()
可能不会发送您提供的所有数据,而
sendall()
在发送所有数据之前不会返回,但这可能需要更长的时间。一般来说,您应该使用
sendall()
,除非您知道需要使用
.send()
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()