【问题标题】:Implementing a non-blocking TCP Server实现非阻塞 TCP 服务器
【发布时间】:2017-09-22 06:48:29
【问题描述】:

我正在尝试实现一个在 recv 或 sendall 操作期间不会(可能)永远挂起的 TCP 服务器。

我认为为活动套接字指定超时就足够了,但情况似乎并非如此:see here

那么,我如何扩展我的代码以确保:

  • recv 无论如何都不会挂机
  • sendall 在任何情况下都不会挂断(好吧,我不确定 sendall 是否可以挂断)

非常感谢任何建议。

【问题讨论】:

标签: python tcp nonblocking


【解决方案1】:

您需要的是select 函数。 它需要 3 个参数;读取列表、写入列表、错误列表。 然后它返回三个值,每个值都是您输入的套接字列表,可以写入或读取。 (如果你想检查的话,或者有一个错误。)

rl , wl , el = select( [ serversocket , clientsocket ] , [] , [] );
for e in rl:
  if e == serversocket:
    acceptConnection( serversocket );
  else:
    readFromClient( clientsocket );

【讨论】:

  • 嗨!谢谢你的回答。这是否也顾及sendall不会挂机?我不需要使活动套接字非阻塞吗?
  • 您想为sendall 进入非阻塞模式,但在下次写入之前,请确保检查您是否可以使用select 写入它。
  • 您不需要使套接字非阻塞。 Select 告诉 zou 是否有东西,然后你就可以开始读/写了
  • 您想要进入非阻塞模式的原因是您不必等待大量数据被发送,然后再继续程序流程。
  • 但是,当使用 select 时,如果客户端崩溃并且没有正确关闭套接字,我是否会遇到服务器卡住的问题?如果在选择操作之后发生崩溃...
猜你喜欢
  • 2019-09-12
  • 2012-02-11
  • 2011-09-04
  • 2019-10-30
  • 2012-01-19
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多