2012-06-26 14 views
1

我一直在寻找一些Python代码有一天,碰到这样的:Python的sendall()与C写的()

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

其中LEN(身体)解析为500K以上的字节。这是发送到一个Apache服务器,应该限制在8190字节(我发现它时,我试图发出类似的请求使用C的write()函数)。那么Python中的sendall()有什么特别之处?

+0

我可以向你保证,apache能够在HTTP请求中接受更多8190字节的数据。 – geoffspear

+0

是的,但它应该返回一个超过请求大小的错误。我将Apache配置为仅使用默认大小8190字节。 –

+1

这段代码中的'req'是什么?除非您发送查询字符串,否则8190值无意义。你用C发送的请求是什么样的? – geoffspear

回答

1

如果你发送数据到Apache或其他任何东西都没关系。我们所讨论的套接字远端的软件对write(2)socket.sendall之间的行为差​​异基本上没有直接的影响。

不同之处在于write(2)尽可能多地写入字节,然后返回一个整数,指出写入的字节数。当然,它不能写超过你通过它。但它可能会写少。对于传递给它的所有字节,内核发送缓冲区中可能没有空间。

将此与socket.sendall进行对比,它会写入您传递给它的所有字节。它通过多次调用write(2)来完成此操作(如有必要)。

+0

考虑到有多少字节可以被接收而没有发生错误的限制,那么reomote服务确实很重要。 –

+0

不是。您访问的第一个缓冲区位于本地TCP/IP堆栈中。在任何字节甚至完全遍历网络之前,您都可以轻松填充该字段。相信在套接字的另一端发生什么“recv”调用序列将与您在本地创建的“send”调用序列相匹配是一个严重的错误。 –