socket.sendは、低レベルの方法であり、基本的にはC/Syscallメソッドsend(3)/send(2)だけです。リクエストされたバイト数より少ないバイト数で送信できますが、送信バイト数が返されます。
socket.sendallは、渡すバッファ全体を送信する、または例外をスローする、高度なPython専用のメソッドです。すべてが送信されるか、エラーが発生するまで、socket.send
を呼び出すことによってそれが実行されます。
ブロッキングソケットでTCPを使用していて、内部で に煩わされたくない場合(ほとんどの単純なネットワークアプリケーションの場合)、 sendallを使用してください。
とPythonドキュメント:
送信()とは異なり、この方法は、全てのデータが送信されたかエラーが発生したいずれか まで文字列からデータを送信し続けます。 には何も返されません。エラーの場合は、例外が発生し、どのくらいのデータを決定 する方法はありませんが、もしあれば、成功した私は、過去に得た簡潔な説明のためにフィリップHagemeisterに
クレジットを送りました。フードsend
下
編集
sendall
使用 - 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()
IMO - '.send()'はすべてのデータを送信するのではなく、 'sendall()'はすべてのデータが送信されるまで返るわけではありません。一般に、あなたが '.send()'を使う必要があることを知らない限り、 'sendall()'を使うべきです。 –