当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《socket.send()和socket.sendall()有什么区别?》经验,为你挑选了1个好方法。

我对Python 感到困惑socket.send()socket.sendall()功能.据我所知,文档 send()功能使用TCP协议,sendall()功能使用UDP协议发送数据.我知道TCP对于大多数Web应用程序来说更可靠,因为我们可以检查哪些数据包是发送的,哪些数据包不是.这就是为什么,我认为使用send()功能可以更可靠而不是sendall()功能.

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

谢谢.



1> kwarunek..:

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

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有