导致挂起的Python套接字

时间:2014-09-22 07:28:48

标签: python sockets

当套接字上发送/接收突发时,偶尔我的python应用程序挂起。 我在这里缺少什么:看起来很基本:

skt.send(packet)

skt.recv_into(pkt)

如果在通话结束后进入睡眠状态(0.2),那么它可以正常工作。

我应该更改为与socket交谈的select()方式吗? 我已经尝试过2.7到3.3这似乎更好,但仍然会发生这种情况。

套接字设置为:

skt = socket(AF_INET, SOCK_STREAM)

skt.connect((ipAddress, nwPort))

2 个答案:

答案 0 :(得分:0)

要讲的信息太少了。我不认为有一个挂起,但是当你读取时,睡眠暂挂数据(你可以用MSG_DONTWAIT或setblocking禁用,或者另一个检查,例如select),因为数据还没有出现。如果您知道它已被发送,则可能存在各种网络延迟,尤其是Nagle's algorithm,您可以使用TCP_NODELAY禁用它。如果您希望程序具有响应性,通常应该使用select或poll - 请注意,对于像TCP这样的流协议,如果您不知道提前到达的确切大小,则需要将其与非阻塞行为结合使用。

答案 1 :(得分:0)

socket.recv_into(buffer[, nbytes[, flags]])的文档规定:

  

从套接字接收最多nbytes个字节,将数据存储到一个   缓冲区,而不是创建一个新的字节串。如果不是nbytes   指定(或0),最多可接收给定的可用大小   缓冲。

通过将nbytes设置为一定数量的字节,尝试更具体地说明从套接字实际接收的数据字节数。通常,消息要么被定界(例如,用CRLF分隔),即使您在recv函数上允许更少的字节,您也可以等待定界符到达;或者它们是固定长度的,在这种情况下,您只需将其设置为该字节长度(或略微超过该长度)即可。