0

私はPythonでいくつかのコードを見ていました(私はPythonについて何も知りません)そして私はこの部分に出くわしました:

def do_req(body):
    global host, req
    data = ""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, 80))
    s.sendall(req % (len(body), body))
    tmpdata = s.recv(8192)
    while len(tmpdata) > 0:
        data += tmpdata
        tmpdata = s.recv(8192)
    s.close()
    return data

これは、後で500,000バイトを超えるような巨大なサイズの本体で呼び出されます。これは、デフォルトの8190バイトの最大リクエストサイズを持つApacheサーバーに送信されます。

s.sendall()私の質問は、「 」の部分で何が起こっているのかということです。もちろん、全身を一度に送ることはできず、モジュラス演算子を使って減らすことができると思います。ただし、Pythonでどのように機能するかはわかりません。誰か説明できますか?ありがとう。

4

2 に答える 2

7

これは実際にはモジュラス演算子ではなく(技術的には、文字列は単に実装されているためです__mod__)、python2スタイルの文字列フォーマット演算子です。

format % values(formatが文字列またはUnicodeオブジェクトである場合)、format%の変換仕様は、0個以上のの要素に置き換えられます。効果は、C言語での使用と同様です。sprintf()

もちろん、全身を一度に送ることはできません

それは確かに内部で処理される低レベルのものである単一のパケットには収まりませんが(おそらくPythonではなく、ソケットに書き込む基礎となるシステムコールによって)

于 2012-06-23T21:08:16.987 に答える
0

いいえ、文字列を操作する場合、 % はフォーマット演算子であるため、本文はここでは縮小されません。

http://docs.python.org/release/2.5.2/lib/typesseq-strings.html

すべてのデータは sendall メソッドによって部分的に送信されます。

socket.sendall は次のように機能します。

do {
        n = sendsegmented(s->sock_fd, buf, len, flags);
        len -= n;
} while (len > 0);

sendsegmented はデータを送信し、len または SEGMENT_SIZE を返します。

于 2012-06-23T22:38:48.393 に答える