当套接字上发送/接收突发时,偶尔我的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))
答案 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
函数上允许更少的字节,您也可以等待定界符到达;或者它们是固定长度的,在这种情况下,您只需将其设置为该字节长度(或略微超过该长度)即可。