我对Python 感到困惑socket.send()
和socket.sendall()
功能.据我所知,文档 send()
功能使用TCP协议,sendall()
功能使用UDP协议发送数据.我知道TCP对于大多数Web应用程序来说更可靠,因为我们可以检查哪些数据包是发送的,哪些数据包不是.这就是为什么,我认为使用send()
功能可以更可靠而不是sendall()
功能.
在这一点上,我想问一下这两个函数之间的确切区别是什么,哪个对Web应用程序更可靠?
谢谢.
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()