【问题标题】:TCP Socket on Server Side Using Python with select on Windows服务器端的 TCP 套接字在 Windows 上使用 Python 和 select
【发布时间】:2019-11-20 13:49:01
【问题描述】:

通过尝试在 python 上对我的服务器进行优化,我偶然发现了一个名为 select 的概念。通过尝试找到任何可能使用的代码,无论我在哪里查看,都很难找到与此主题的 Windows 兼容性。

任何想法如何在 Windows 上使用 select 编程 TCP 服务器?我知道解除阻塞套接字以保持与它的兼容性的想法。欢迎提出任何建议。

【问题讨论】:

    标签: python windows sockets select


    【解决方案1】:

    在 Windows 下使用 select() 与在其他操作系统下使用 99% 相同,但有一些细微的差异。细微的变化(至少是我知道的)是:

    1. 在 Windows 下,select() 仅适用于真实的网络套接字。特别是,不要费心在 Windows 下尝试在 stdinselect(),因为它不起作用。

    2. 在 Windows 下,如果您尝试非阻塞 TCP 连接并且 TCP 连接异步失败,您将仅通过第三个(“异常”)fd_set 收到失败通知。 (在其他操作系统下,您将收到连接失败的 TCP 套接字也已准备好读取/写入的通知)

    3. 在 Windows 下,select() 将失败,如果您没有向它传递至少一个有效的套接字(因此您不能使用 select([], [], [], timeoutInSeconds) 作为 time.sleep() 的替代品,就像在某些情况下一样其他操作系统)

    Windows 的 select() 与任何其他操作系统的 select() 不同。 (如果您对如何使用select() 有真正的疑问,您可以通过网络搜索找到相关信息)

    【讨论】:

    • 谢谢!我认为这是一个很好的答案,但是是的。我听说你应该通过两个不同的线程来分离输入和输出,对吗?
    • 如果您想在 Windows 下从 stdin 读取,您需要在单独的线程中执行此操作,因为 Windows stdin 仅支持阻塞读取,因此任何尝试从中读取的线程stdin 最终被无限期阻塞(即直到有更多数据进入读取)。微软让优雅处理变得尽可能困难:(
    • 所有网络输入和输出都可以在一个线程中处理,不过,只要您使用非阻塞套接字并且只在select()内阻塞。
    猜你喜欢
    • 2018-07-02
    • 2019-03-11
    • 1970-01-01
    • 2018-04-26
    • 2011-12-20
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多