当前位置: 首页 > 面试题库 >

Python套接字缓冲

端木鹏
2023-03-14
问题内容

假设我想使用标准socket模块从套接字读取一行:

def read_line(s):
    ret = ''

    while True:
        c = s.recv(1)

        if c == '\n' or c == '':
            break
        else:
            ret += c

    return ret

到底发生了s.recv(1)什么?每次都会发出系统调用吗?我想无论如何我应该添加一些缓冲:

为了与硬件和网络实际情况达到最佳匹配, bufsize 的值应为2的相对较小的幂,例如4096。

http://docs.python.org/library/socket.html#socket.socket.recv

但是编写高效且线程安全的缓冲似乎并不容易。如果我使用该file.readline()怎么办?

# does this work well, is it efficiently buffered?
s.makefile().readline()

问题答案:

recv()通过调用C库函数直接处理该调用。

它将阻止套接字等待数据。实际上,它只会让recv()系统调用阻塞。

file.readline()是有效的缓冲实现。它不是线程安全的,因为它假定它是唯一读取文件的文件。(例如,通过缓冲即将到来的输入。)

如果使用文件对象,则每次read()使用正参数调用时,底层代码recv()仅会请求所请求的数据量,除非已对其进行了缓冲。

如果满足以下条件,它将被缓冲:

  • 您已经调用readline()来读取完整的缓冲区

  • 行的结尾在缓冲区的结尾之前

因此将数据保留在缓冲区中。否则,缓冲区通常不会溢出。

问题的目的尚不清楚。如果需要在读取之前查看数据是否可用,可以通过select()或将套接字设置为非阻塞模式s.setblocking(False)。然后,如果没有等待的数据,读取将返回空,而不是阻塞。

您正在读取一个具有多个线程的文件或套接字吗?我将让一个工人来读取套接字并将接收到的项目馈送到队列中,以供其他线程处理。

建议参考进行系统调用的Python
Socket
Module源代码

和C源代码。



 类似资料:
  • 问题内容: 从堆栈溢出的其他帖子中应该可以正常工作 但由于某种原因,它只是挂在()上而从不打印。我知道对www.cnn.com的请求将对数据进行分块,但我至少应该从中读取一些信息,对吗? PS我知道这是不是做到这一点的最好办法,而且有像库和在那里,但我不能使用那些为这个项目(这是学校)。我必须使用图书馆 问题答案: 您忘记在请求行之后发送空白行: 此外,HTTP 1.1指定您应添加HTTP 1.1

  • 当我运行此代码时,我得到[WinError 10057]。我不知道为什么当我浏览到时它会崩溃,因为我的朋友机器上也有相同的代码。。。 为什么我得到这个错误?一直在四处寻找,但没有真正找到答案。有什么建议吗?

  • 试着找出我做错了什么。我一直收到这样的错误:“失败:WebSocket握手期间出错:Sec WebSocket接受不匹配”。 下面是我从服务器得到的: 我采用了“EN04JZBFLCFCHK5QNUXJG==”并添加了“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”以获得以下内容: 所以我的回应是: 我不确定我做错了什么,但从我在其他示例中看到的情况来看,我的webso

  • 问题内容: 我正在尝试在Linux平台上探索协议缓冲区(PB),我的编码语言是C ++。我在协议缓冲区在线文档中找到了示例,但没有特定于套接字发送和接收的内容(或者我完全错过了:))。因此,我决定在实际消息之前添加消息Length,并通过套接字发送它。如果有人可以提出比我计划做的更好的解决方案,并且在PB中已经准备好任何用于创建此类数据包的东西,我将不胜感激。 但是我仍然在服务器端遇到问题,必须对

  • 我正在Linux上编写一个C应用程序。我的应用程序有一个 UDP 服务器,它在某些事件上向客户端发送数据。UDP 服务器还会收到来自客户端的一些反馈/确认。 为了实现这个应用程序,我使用了一个UDP套接字(例如< code>int fdSocket)来发送和接收来自所有客户端的数据。我将这个socked绑定到端口8080,并将套接字设置为非阻塞模式。 我创建了两个线程。在一个线程中,我等待某个事件

  • 我试图编写套接字错误处理(确切地说是错误111-连接拒绝),但什么也没有发生。终端打印错误号111发生,但它没有做任何事情: Traceback(最近的调用为last):文件“test.py”,第20行,在s.connect((IP,PORT))中文件“/usr/lib/python2.7/socket.py”,第224行,在meth返回getattr(self._sock,name)(*args