【问题标题】:What is the difference between socket.send() and socket.sendall()?socket.send() 和 socket.sendall() 有什么区别?
【发布时间】:2016-03-19 01:30:00
【问题描述】:

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

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

谢谢。

【问题讨论】:

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

标签: python sockets


【解决方案1】:

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

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

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

还有 python 文档:

与 send() 不同,此方法继续从字符串发送数据,直到 要么所有数据都已发送,要么发生错误。没有返回 成功。出错时会引发异常,并且 没有办法 确定成功发送了多少数据(如果有)

感谢 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    相关资源
    最近更新 更多