如何检测已关闭的套接字或实现Apple推送通知提供程序

时间:2012-05-06 06:03:38

标签: python sockets

我正在开发一个简单的Web服务器,它将推送通知发送到我的iPhone应用程序。 我尝试过使用现有的Python软件包,但他们都遇到了这个问题:

当发送无效令牌时,Apple将发回错误消息并关闭套接字。我需要发送大量的推送通知,但是如果其中一个推送有无效的令牌,则其余的将不会发送给Apple。

目前,我的代码看起来像这样:

for m in messages:
    socket.send(m)

但是当第一条消息具有无效令牌时,Apple会在收到第一条消息后立即关闭套接字,套接字仍然会发送所有消息而没有任何错误。

我不能在每条消息超时后执行recv,因为这将花费太长时间。关于套接字何时关闭并打开一个新套接字,我该怎么办?

2 个答案:

答案 0 :(得分:1)

如果套接字已在另一端关闭,则recv上的套接字应返回0或导致错误。


您可以检查send发送的字节数。


更新:您可能希望另一个可能的read here来监控套接字连接是否仍然存在。


Update-1:另一种方法可能是在写入操作的同时在有问题的套接字上运行一个不断读取的线程......正如你所说:时间是你的极限。

答案 1 :(得分:0)

我了解到TCP级别无法找到发送的数据包。我决定只发送所有消息,然后等待(超时)Apple的任何错误消息。如果有任何错误,请重复发送失败的错误。

我决定采用这种方式,因为获取无效令牌应该是一种罕见的事件,并且大多数情况下所有通知都将通过。