2012-05-06 16 views
1

私のiPhoneアプリケーションにプッシュ通知を送信する単純なWebサーバーで作業しています。 私は既存のPythonパッケージを使用しようとしましたが、すべてこの問題を抱えています:閉じたソケットを検出する方法、またはAppleプッシュ通知プロバイダを実装する方法

無効なトークンが送信されると、Appleはエラーメッセージを返してソケットを閉じます。多数のプッシュ通知を送信する必要がありますが、そのうちの1つが無効なトークンを持っている場合、残りの部分はAppleに配信されません。

ので、現在、私のコードは次のようなものになります。

for m in messages: 
    socket.send(m) 

をしかし、メッセージの最初に無効なトークンを持っているので、Appleは、すぐにそれが最初のメッセージを受信するとソケットを閉じたときに、ソケットはまだすべての送信メッセージはエラーなし。

タイムアウトのある各メッセージの後にrecvを実行する余裕はありません。時間がかかりすぎるためです。ソケットが閉じられたときを知って新しいソケットを開くにはどうすればいいですか?

答えて

0

TCPレベルでは、どのパケットが送信されたのかわかりません。私はすべてのメッセージを送信し、アップルからのエラーメッセージがあれば(タイムアウトで)待つことにしました。エラーがある場合は、失敗したものを繰り返し送信してください。

無効なトークンを取得するのはまれなイベントであるため、これを行うことにしました。ほとんどの場合、すべての通知が通過します。

+0

これは不正な形式のパケットを送信したかどうかを検出する良い方法です。どのような理由であれ、ソケットが遠端で閉じている状況を捕捉しません。そのシナリオでは、あなたが@alkが指摘する状況に悩まされています。 –

+0

これは、パフォーマンス面でどれだけ優れた解決策があるかわかりません。わずか1秒待ってもパフォーマンスに深刻な影響がありますが、この期間内にAppleからの返信を保証するものではありません。 –

+0

@MartinKonecny:そうです。私の場合、大きなバッチを送っていたので大丈夫でした。私はそれのまわりに他の方法があるかどうかわからない。 –

1

ソケットがもう一方の端で閉じていた場合、recv0を返してエラーになります。


sendによって送信されたバイト数を確認できます。


更新:ソケット接続がまだ生きている場合は、別のpossibilty上にread hereを好むかもしれないが監視します。


アップデート-1:別のアプローチは、あなたが言及として...書き込み動作と並行して、問題のソケットで常に読んでスレッドを実行することにより、かもしれない:時間はあなたの限界です。

+0

送信されたバイトをチェックしようとしましたが、すべて送信されたように見えます。 –

+0

* sigh * - はい、これは起こる可能性があります。キープアライブソケットオプションを使用して、より信頼性の高い解決法についての相談へのリンクについては、私の最新のコメントを参照してください。 @BarumRho – alk

+0

あなたの答えをありがとうが、私はキープアライブが私の問題を解決するとは思わない。 –

関連する問題