如何在Python ssl套接字缓冲中使用select?

Bas Wijnen

我的问题类似于python-select.select()如何工作?但是,那里的解决方案对我不起作用,因为我没有打开()文件。相反,它是一个套接字。我找不到任何方法可以在文档中将其设置为不缓冲

我有一个glib mainloop(使用select),在其中注册了要读取的套接字。因为socket.recv()要求我指定接收缓冲区的大小,所以读取少于读取的套接字的字节并不稀奇。只要内核对它们进行缓冲,就可以了。select仍会将套接字标记为“准备读取”。但显然Python也有一个缓冲区。对于大文件,在数据流的末尾,recv()将读取其中的一部分,其余部分将由Python缓冲,并不再选择套接字上的触发器,直到发送新数据为止。此时,在新数据之前接收“丢失”数据;没有数据丢失。

我的问题是:我该如何解决?有没有一种方法可以禁用套接字上的Python缓冲区?如果不是,是否有办法检查缓冲区是否为空,所以我可以确保在回调之前不从回调中返回?

编辑:

如评论中所述,Python不会在套接字上添加额外的缓冲区,因此这可能不是问题。我无法创建该问题的最小示例。但是,这似乎与使用ssl套接字有关。我忘记了使用加密连接。禁用加密似乎可以解决此问题,但是我不接受。因此,上面的问题仍然存在,请注意,缓冲区可能在ssl模块中实现。

显示该问题的示例代码:

#!/usr/bin/python

import glib
import socket
import ssl

def cb (fd, cond):
    print ('data: %s' % repr (s.read (1)))
    return True

s = ssl.wrap_socket (socket.create_connection (('localhost', 1234)))
glib.io_add_watch (s.fileno (), glib.IO_IN, cb)
glib.MainLoop ().run ()

然后使用

openssl s_server -accept 1234 -key file.key -cert file.crt

运行python程序将建立连接。发送多于一个字节的数据将使程序仅打印第一个字节。发送更多字节时,将先读取其余的块,然后读取第一个新字节,然后再次等待。这很容易理解:只要ssl缓冲区中有数据,就不会从内核缓冲区中读取新字节,因此select继续报告它。

Bas Wijnen

在查看ssl源代码时,我发现了一个未记录的函数,该函数可以满足我的需要:pending()。可以这样使用:

#!/usr/bin/python

import glib
import socket
import ssl

def cb(fd, cond):
    print('data: %s' % repr(s.read(1)))
    while(s.pending()):
        print('more data: %s' % repr(s.read(1)))
    return True

s = ssl.wrap_socket (socket.create_connection(('localhost', 1234)))
glib.io_add_watch(s.fileno(), glib.IO_IN, cb)
glib.MainLoop().run()

这样就解决了问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在Python和子进程中使用套接字?

来自分类Dev

如何在套接字中使用raw_input

来自分类Dev

Python:在OSX中使用原始套接字

来自分类Dev

如何在Python中使用管道时关闭套接字连接

来自分类Dev

使用Select的Python套接字检查数据

来自分类Dev

如何在python中设置套接字的发送缓冲区大小

来自分类Dev

如何配置phoenix以在PostgreSQL中使用套接字

来自分类Dev

如何在Angular 2应用程序中使用Phoenix通道/套接字?

来自分类Dev

如何在Objective-C中使用本地域套接字

来自分类Dev

零停机时间的目标,如何在套接字和(g)unicorn中使用新贵:

来自分类Dev

如何在UWP中使用StreamSocket时知道套接字连接是否仍然有效?

来自分类Dev

如何在C ++中使用套接字(UDP)在LAN上查找服务器

来自分类Dev

如何在实时多人游戏中使用网络套接字?

来自分类Dev

如何在Java中使用相同的套接字连接执行多个HTTP请求?

来自分类Dev

如何在没有套接字的Android中使用TCP客户端?

来自分类Dev

如何在 C 中使用 TCP 套接字发送 size_t 变量?

来自分类Dev

如何在D中创建SSL套接字?

来自分类Dev

如何在Ruby中创建双向SSL套接字

来自分类Dev

如何使用python在ssl/tls套接字连接中获取域的IP

来自分类Dev

您如何正确地为套接字构造和使用缓冲区?

来自分类Dev

如何重置python中使用的套接字地址?(解决WinError 10048)

来自分类Dev

在Python中打开SSL套接字连接

来自分类Dev

忽略验证SSL证书python套接字

来自分类Dev

如何在Java中使用套接字打印/获取传入的HTTP POST请求的有效负载(带有套接字)

来自分类Dev

如何在Python客户端和C ++服务器上使用套接字

来自分类Dev

如何在套接字中获取最新的Recv通知(Python)

来自分类Dev

如何在Python套接字中进行发送和接收?

Related 相关文章

  1. 1

    如何在Python中使用套接字创建通道

  2. 2

    如何在Python中使用套接字创建通道

  3. 3

    如何在Python和子进程中使用套接字?

  4. 4

    如何在套接字中使用raw_input

  5. 5

    Python:在OSX中使用原始套接字

  6. 6

    如何在Python中使用管道时关闭套接字连接

  7. 7

    使用Select的Python套接字检查数据

  8. 8

    如何在python中设置套接字的发送缓冲区大小

  9. 9

    如何配置phoenix以在PostgreSQL中使用套接字

  10. 10

    如何在Angular 2应用程序中使用Phoenix通道/套接字?

  11. 11

    如何在Objective-C中使用本地域套接字

  12. 12

    零停机时间的目标,如何在套接字和(g)unicorn中使用新贵:

  13. 13

    如何在UWP中使用StreamSocket时知道套接字连接是否仍然有效?

  14. 14

    如何在C ++中使用套接字(UDP)在LAN上查找服务器

  15. 15

    如何在实时多人游戏中使用网络套接字?

  16. 16

    如何在Java中使用相同的套接字连接执行多个HTTP请求?

  17. 17

    如何在没有套接字的Android中使用TCP客户端?

  18. 18

    如何在 C 中使用 TCP 套接字发送 size_t 变量?

  19. 19

    如何在D中创建SSL套接字?

  20. 20

    如何在Ruby中创建双向SSL套接字

  21. 21

    如何使用python在ssl/tls套接字连接中获取域的IP

  22. 22

    您如何正确地为套接字构造和使用缓冲区?

  23. 23

    如何重置python中使用的套接字地址?(解决WinError 10048)

  24. 24

    在Python中打开SSL套接字连接

  25. 25

    忽略验证SSL证书python套接字

  26. 26

    如何在Java中使用套接字打印/获取传入的HTTP POST请求的有效负载(带有套接字)

  27. 27

    如何在Python客户端和C ++服务器上使用套接字

  28. 28

    如何在套接字中获取最新的Recv通知(Python)

  29. 29

    如何在Python套接字中进行发送和接收?

热门标签

归档