如何读取套接字缓冲区中的所有可用字节? Python3

时间:2018-04-11 03:47:01

标签: python-3.x sockets

我想读取缓冲区中的所有可用字节,下面的代码由100字节的块读取..

1)是否可以读取缓冲区中的所有字节?

2)sock.recv()的默认值是多少? //没有参数

row1 = "search key     words today"
def easysearch(content, keywords):
    row1 = content
    searchresult = re.findall(re.sub(r' ', ' *', keywords, flags=re.IGNORECASE), row1, re.DOTALL)
    if count_chars(searchresult[0])/count_chars(keywords) > 0.5:
        return searchresult

easysearch(row1, r'key words')
easysearch(row1, r'key wrods')

row1 = "search key   $ @ $  words today"
def easysearch(content, keywords):
    row1 = content
    searchresult = re.findall(re.sub(r' ',r'(?=$*)(?=@*)(?= *)*', keywords), row1, re.DOTALL)
    if count_chars(searchresult[0])/count_chars(keywords) > 0.5:
        return searchresult

easysearch(row1, r'key words')
easysearch(row1, r'key wrods')

UPD: 3)如果我设置sock.recv(1000000),它会读取所有缓冲区,对吗? (假设数据速度要小得多)

主要目的是不断阅读流

1 个答案:

答案 0 :(得分:1)

  

1)是否可以读取缓冲区中的所有字节?

recv不知道套接字缓冲区中有多少字节或尝试从缓冲区读取时可能有多少字节。但您可以在非阻塞套接字上使用recv并读取,直到您收到错误,因为没有更多可用数据(errno.EWOULDBLOCK)。或者您可以在select.select中使用零超时(0,而不是None)来检查(轮询)是否还有要读取的数据。

  

2)sock.recv()的默认值是多少? //没有参数

documentation for recv清楚地说明了如何调用此函数:

  

socket.recv(bufsize [,flags])

因此,bufsize不在你可以跳过的参数中,你尝试这样做会导致错误。

  

3)如果我设置sock.recv(1000000),它会读取所有缓冲区,对吗?

它只会读取最多给定的字节数。它实际读取的数量还取决于底层内核套接字缓冲区的大小,即即使客户端已经发送它们,它也无法读取尚未在套接字缓冲区中的任何数据。

如果套接字是SSL套接字,则适用另一个限制。在这种情况下,recv通常只返回当前SSL帧的数据。