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 字节。这将发送到 Apache 服务器,该服务器的最大请求大小默认为 8190 字节。

我的问题是“ s.sendall()”部分发生了什么?显然整个身体不能一次发送,我猜它是通过模运算符减少的。不过,我不知道它在 Python 中是如何工作的。谁能解释一下?谢谢。

4

2 回答 2

7

它不是真正的模运算符(从技术上讲,它是因为字符串只是实现__mod__),而是python2 样式的字符串格式化运算符

给定format % values(其中format是字符串或 Unicode 对象),格式%中的转换规范被替换为values的零个或多个元素。效果类似于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);

其中 sendegmented 发送数据并返回 len 或 SEGMENT_SIZE

于 2012-06-23T22:38:48.393 回答