1

先日、いくつかの Python コードを見ていて、これに出くわしました。

   s.sendall(req % (len(body), body))

len(body) が 500K バイト以上に解決されました。これは、8190 バイトを上限とするはずの Apache サーバーに送信されていました (C の write() 関数を使用して同様のリクエストを発行しようとしたときに、上限が 8190 バイトであることがわかりました)。では、Python の sendall() の何が特別なのでしょうか?

4

1 に答える 1

1

データを Apache に送信するか、それ以外に送信するかは問題ではありません。私たちが話しているソケットのリモート エンドのソフトウェアは、基本的に と の動作の違いに直接的な影響を与えませwrite(2)socket.sendall

違いは、write(2)可能な限り多くのバイトを書き込み、書き込み数を示す整数を返すことです。もちろん、合格以上の書き込みはできません。しかし、それはより少なく書くかもしれません。カーネル送信バッファに、渡されたすべてのバイト用のスペースがない場合があります。

これをsocket.sendall、渡したすべてのバイトを書き込む と比較してください。これはwrite(2)、必要に応じて複数回呼び出すことによって行われます。

于 2012-06-26T21:21:30.997 に答える